2017-04-30 14 views
2

C의 short int는 16 비트를 포함하고 첫 번째 비트는 값이 음수인지 아니면 양수인지를 나타냅니다. 내가 변수의 첫번째 비트가 1이 그래서 프로그램의 출력 UV 동일 기대 알고 부정C 짧은 Int를 부호없는 short로 변환

int main() { 
    short int v; 
    unsigned short int uv; 
    v = -20000; 
    uv = v; 
    printf("\nuv = %hu\n", uv); 
    return 0; 
} 

V 값 이후 : I는 다음과 같다 C 프로그램을 = 52,768b/c 20,000 + (2^15) = 52,768.

대신 출력으로 uv = 45536이 표시됩니다. 논리가 잘못된 부분은 무엇입니까?

+2

숫자는 2의 보수로 저장됩니다 (https://en.wikipedia.org/wiki/Two%27s_complement). 따라서 가장 큰 부호없는 숫자 (0xFFFF)는 실제로 -1 – twain249

+2

입니다. 마지막 비트를 설정하기 만하면 음수가 표시되지 않습니다. 그것들은 2 진 보수 즉, 모든 비트가 부정 +1 된 것으로 표현됩니다. http://stackoverflow.com/questions/1049722/what-is-2s-complement – Marian

+0

@Marian을 참조하십시오.이 게시물은 매우 유용했습니다. 감사! – RyeGuy

답변

5

당신이 C의 변환 규칙에 의해 설명 될 수 있습니다보고있는 동작 :

6.3.1.3 서명 및 정수 유형의 값이 다른 변환됩니다 부호없는 정수

1 _Bool 이외의 정수 유형 인 경우 값을 새 유형으로 나타낼 수있는 경우 값은 변경되지 않습니다.

2 그렇지 않으면 새 형식이 부호가없는 경우 값이 새 형식의 범위에 속할 때까지 새 형식에서 나타낼 수있는 최대 값 하나를 반복하여 더하거나 뺍니다.

(이 인용 C99에서입니다.)

-20000 이는 부정적 때문에 unsigned short로 표현할 수없는

. 대상 유형은 부호가 없으므로 범위에 들어갈 때까지 65536 (즉 USHORT_MAX + 1)을 반복적으로 추가하여 값을 변환합니다. -20000 + 65536은 정확히 45536입니다.

이 동작은 C 표준에서 필수이며 음수가 실제로 메모리에 표시되는 방식과 아무 관련이 없습니다 (특히 sign/magnitude 또는 ones' complement을 사용하는 컴퓨터에서도 동일한 방식으로 작동 함).

+1

모듈로 동작은 표준에 의해 요구된다 - 'USHORT_MAX'는 '65536'이 아니다 (더 클 수있다) –