2017-01-24 7 views
0

그래서 나는 다음과 같은 출력을 해석하기 위해 노력하고있어 :짧은 int와 unsigned short의 출력?

short int v = -12345; 
unsigned short uv = (unsigned short) v; 

printf("v = %d, uv = %u\n", v, uv); 

Output: 
v = -12345 
uv = 53191 

그래서하는 질문 :이 프로그램은 2의 보수 시스템에서 실행 때 왜 정확한 출력이 생성됩니다?

unsigned short 값을 전송할 때 어떤 결과가 발생합니까?

+1

나에게 맞는 것 같습니다. 어떤 결과를 기대 했습니까? –

+0

@SteveSummit 사실 나에게 잘못된 것 같습니다 ... http://port70.net/~nsz/c/c11/n1570.html#6.3.1.3p2에 따르면 '53190'이어야합니다. 내가 그것을 정확하게 읽고 있다면 ... –

+0

@EugeneSh. 올바르게 읽지 못한다 ;-) –

답변

2

내 대답은 16-bit의 2의 보수 연산을 가정합니다.

-12345의 값을 찾으려면 12345을 보완하고이를 보완하고 1을 추가하십시오. 의 '의 1에의's의 모든 1 '의 0에 S'의 모든 0을 변경

12345 is 0x3039 is 0011000000111001. 

보완 수단 :

1100111111000110 is 0xcfc6 is 53190. 

하나를 추가 53191.

내부적으로 -123450xcfc7 = 53191으로 표시됩니다.

하지만 부호없는 번호로 해석하면 분명히 단지 53191입니다. (그리고 같은 크기의 부호없는 정수에 부호있는 값을 할당 할 때 일반적으로 일어나는 일은 아무 것도 변환하지 않고 정확한 비트 패턴을 지정하는 것입니다. 그러나 나중에 일반적으로 그 값을 다른 방식으로 해석합니다 당신은 %u로 인쇄 할 수 있습니다.)

이 생각하는 또 다른, 어쩌면 더 쉬운 방법을 16-bit 산술 그래서 그냥 (0의 또 다른 이름 인 것으로 65536 생각할 수 2 16 = 65536에서 "순환"이다 0:0024:00은 모두 자정의 이름입니다. 따라서 -1234565536 - 12345 = 53191입니다.

+0

정말 고마워요. 그저하고 있었지만 어쨌든 나는 길을 잃었습니다. 마지막 문장은 실제로 그것을 보는 좋은 방법입니다. :) 고마워요. –

+0

대답의 첫 번째 부분은 C 언어의 맥락에서 질문과 관련이 없습니다. 이 동작은 기계의 "2-complementness"에 의존하지 않습니다. 변환과 재 해석은 완전히 다른 두 가지 개념입니다. 이 경우 우리는 전환을 다루고 있습니다. 재 해석이 전혀 필요 없습니다. 재 해석을 통해 그것을 설명하려고 시도하는 것은 가장 적은 것을 말하기에 오도합니다. – AnT

+0

@AnT 제 대답은 C 언어를 전혀 다루지 않으려 고했는데, 그것은 OP가 물었던 2의 보수 연산을 설명했습니다. "해석"에 대한 괄호 안에는 의도적으로 모호했지만, 나는 약간의 설명을 덧붙였다. –

1

변환 규칙은 부호가있는 정수를 부호없는 정수로 변환 할 때 C 표준에 정의 된대로 값에 TYPE_MAX + 1을 반복적으로 추가해야합니다.

6.3.1.3 Signed and unsigned integers에서 :

그렇지 신형 부호 인 경우, 그 값은 반복 및 추가 의 값이 될 때까지 새로운 형태로 표현 될 수있는 최대 값보다 1 감산 로 변환되고 새로운 유형 의 범위 안에 있습니다.

USHRT_MAX 65535 다음 65535 + + 1-1234553191 인 경우에 추가.

1

출력은 2의 보수 또는 16 또는 32 비트 int에 의존하지 않습니다. 보이는 출력은 완전히 정의되어 있으며 드문 1의 보수 또는 부호 크기 머신에서 동일합니다.결과는 16 비트 unsigned short

-12345가 최소 할당 범위 인 short 내에 있으므로 할당에 문제가 없습니다. short이 ... 인수로 전달되면 shortint의 범위에 있으므로 값이 변경되지 않고 int으로 일반적인 프로모션이 진행된다고 생각됩니다. "%d"int 기대되므로 출력

short int v = -12345; 
printf("%d\n", v); // output "-12345\n" 

"-12345" 잘 정의 된 유형의 부호가 음수를 할당한다. 16 비트 unsigned short으로 uv의 값은, 값 인 ... 인수로 전달 unsigned short 53191.

의 최종 값 (이 경우에는 65536) USHRT_MAX+1 최소 배수 인 플러스 -12345 int 또는 unsigned으로 변환되며, unsigned short의 전체 범위가 포함됩니다. IAC, 은 변경되지 않습니다. "%u"unsigned과 일치합니다. 또한 값이 int 또는 unsigned으로 표현 될 수있는 int과 일치합니다. 서명되지 않은 짧은에 대한 값을 캐스팅 할 때

short int v = -12345; 
unsigned short uv = (unsigned short) v; 
printf("%u\n", v); // output "53191\n" 

어떤 작업이 결과로 이어질?

캐스팅은 최종 결과에 영향을 미치지 않습니다. 동일한 결과가 캐스트없이 발생했을 것입니다. 캐스트는 조용한 경고에 유용 할 수 있습니다.

+0

나는 지금 ... 당신의 모든 도움에 감사드립니다. 정말이 사실을 이해하는 데 도움이되었습니다. –