2013-06-01 6 views
1

순수 ANSI C (C89)에서 다음과 같은 내용이 있습니다.2 개의 부호없는 int 값의 차이에 대한 printf 형식

unsigned y=<smallnumber>,x=y+3; 
printf("%<whatgoeshere>\n",x-y); 

가 나는 3를 인쇄 할 절대적으로 확인하기 위해 % 후에는 어떻게 배치해야합니까? 여기에 두 개의 피연산자가 모두있는 경우 %u (결과는 부호가 없음) 및 %d (정수 표현은 printf에 인수를 전달할 때 int으로 변환 됨)에 대한 인수를 볼 수 있습니다.

물론 합리적인 컴파일러에서 작동하므로 정확히 여기에서 묻습니다. :-) 나는 하나만이 표준에 정말로 맞는 것을 느낀다. (그렇다고 잘못 될 수도있다.)

답변

5

부호 없음. %u을 사용하십시오. 통합 표현식에서 기본 판촉을 수행 할 때 (printf()이 가변 함수이므로) 부호가없는 부호가있는 변환은 이 아니고이 발생합니다.

+0

특히, '부호없는 정수'는 '부호있는 정수'로 승격되지 않습니다. 'unsigned char' 또는'unsigned short'는 그 범위가'unsigned int'의 범위의 부분 범위 인 경우에만됩니다. –

+0

@ H2CO3 "서명되지 않은 전환으로 서명되지 않았습니다."- 확실합니까? Visual Studio에서'% d' 및'x = y-3'을 사용하여 체크합니다. 콘솔에서'-3'을 보았습니다. – kotlomoy

+0

@KeithThompson 예, 정확합니다. –

0

그것은 %u는 달리, X < Y 작동이 방법

printf("%d\n", (int)(x-y)); 

.

x-y의 결과가 부호있는 int 범위를 벗어나더라도 작동하지 않더라도.