2009-02-07 2 views
4

K & R 도서의 두 번째 버전을 읽고 있는데 연습 중 하나는 limits.h 헤더에 정의 된 최대 정수 값을 모두 인쇄해야합니다.왜 printf()는 큰 정수에 대해 -1을 출력합니까?

unsigned int: 0 to -1 

가 어떻게 -1 가져 와서 : 그러나,이 ...

printf("unsigned int: 0 to %d\n", UINT_MAX); 

... 다음 출력? 누구든지이 행동을 설명 할 수 있습니까?

Vista에서 Digital Mars C 컴파일러를 사용하고 있습니다.

+0

제쳐두고 컴파일러는이 실수에 대해 경고 할 수 있어야합니다. 그렇지 않은 경우, 더 많은 경고를 켤 수 있는지 확인하거나 다른 컴파일러 사용을 고려하십시오. –

답변

15

UINT_MAX는 부호있는 정수로 처리 될 경우 -1로 해석되기 때문입니다. 그 이유는 정수가 two's-complement에 표시되기 때문입니다. 따라서 -1과 4294967296 (즉, UINT_MAX)은 동일한 비트 표현 (0xFFFFFFFF, 즉 모든 비트가 설정 됨)을 가지므로 여기서 -1을 얻습니다.

업데이트 :
당신이 사용하는 경우 "% u는"형식의 문자열로 당신이 예상 된 결과를 얻을 것이다.

+0

"% u"이 (가) 정상적으로 작동합니다. 나는 K & R 녀석들이 왜 그들의 책에서 "% u"를 언급하지 않았는지 궁금해하고있다. 그들이했다면 질문은 나오지 않을 것이다. – Ree

+0

나는 printf 문장의 텍스트가 저자가 부호없는 int의 속성을 보여주기를 제안했기 때문에 이것이 책의 오류라고 생각한다. 실제로는 그렇지 않다. – newgre

+1

물론 K & R은 그들의 책에서 "% u"를 언급합니다 (154 페이지는 한 예입니다). 우리는 여기서 K & R에 대해 말하고 있습니다. – volni

9

printf에서 % d은 (는) 부호있는 십진 정수이며 % u을 (를) 대신 사용해보십시오.

부호없는 int의 최대 값에는 최상위 비트가 설정됩니다 (모두 1입니다). 부호있는 int를 사용하면 최상위 비트가 음수를 지정하므로 서명되지 않은 int를 부호있는 int로 인쇄 할 때 printf는 음수라고 생각합니다.

관련 문제