2013-04-20 5 views
-1
#include <stdio.h> 

main() { 
    unsigned a = -20; 
    unsigned b = 10; 
    printf("%d\n", (a % b)); 
    printf("%d\n", (-20 % 10)); 
} 

Output: 
6 
0 

번째의 printf 인쇄 예상 값을 제공 6. 이유 부호의 int이 예기치 출력?C : 부호 INT의 나머지 연산자 예기치 출력을 제의 printf 인쇄하는 동안 0

+3

'1 << 32'가 10으로 나눌 수 없기 때문에? BTW : * 왜 * 서명되지 않은 int에 음수 initialiser를 사용합니까? BTW2 : printf()는 부호없는 int에 대한 '% u'지정자를가집니다. '% d '은 부호있는 int를위한 것이다. – wildplasser

답변

4

은 0에서 UINT_MAX까지의 값을 가질 수 있으며 음수는 사용할 수 없습니다. 따라서 -20-20 + UINT_MAX + 1으로 변환됩니다. 시스템에

:

(-20 + UINT_MAX + 1) % 10 != -20 % 10 
2

그리고 당신은 무엇을 기다리고 있습니다?

a % b이,의 20, (UINT_MAX-20+1) % 10의 부호없는 int 값과 결과의 형식으로 단항 -을 값을 대체하고 적용 할 수에 해당 unsigned int 그리고 당신은 잘못 %d, 그것을 인쇄하고 있습니다. 여기서 %u을 사용해야합니다.