2009-12-02 4 views
5

부호없는 정수가 있지만 % d를 사용하여 인쇄 할 때 거기에 때때로 음수 값이 있습니까?C 부호없는 int가 음수 값을 제공합니까?

+1

컴파일러에서 이러한 종류의 오류에 대해 경고하는 옵션이 있는지 확인하십시오. 그것은 - gcc로 포맷합니다. –

+0

[부호없는 정수의 최대 값을 인쇄하는 방법은 무엇입니까?] (http://stackoverflow.com/questions/12812812/how-can-i-print-maximum-value-of-an-unsigned-integer) –

답변

10

이 작동합니다 :

unsigned int a; 
printf("%u\n", a); 

설명 : 대부분의 아키텍쳐에는 정수가 two's complement에 표시됩니다 서명했다. 이 시스템에서 (여기서 N = sizeof(int))보다 작은 양수는 int 또는 unsigned int을 사용하는지 여부에 관계없이 동일한 방식으로 나타납니다. 그러나 부호없는 int의 숫자가 2**(N-1)보다 큰 경우 부호있는 숫자가 2의 보수로 표시됩니다. 즉, 을 전달할 때 printf이 전달한 값입니다.

26

인쇄 %d은 정의 된 유형에 관계없이 정수를 부호있는 십진수로 읽습니다.

부호없는 숫자를 인쇄하려면 %u을 사용하십시오.

이것은 가변 인수를 처리하는 C의 방법 때문에 발생합니다. 컴파일러는 스택에서 값 (void*을 입력하고 호출 스택을 가리킴)을 가져오고 printf은 사용자가 지정한 형식 문자열에서 데이터에 포함 된 내용을 파악해야합니다.

당신은 형식 문자열을 제공해야하는 이유는이 - C는에서 일반 또는 사전 정의 된 toString를 얻을 수 RTTI의 방법이나 (예를 들어 자바 Object)는 '기본 클래스'가 없습니다.

+4

Nitpick : C는 값으로 호출하므로 컴파일러는 포인터가 아니라 인수 값을 가져옵니다. 값 (printf ("% u", & myvariable);)에 대한 포인터를 전달하지 않으면 직접 값을 전달합니다 (printf ("% u", myvariable);). – unwind

+1

실제로'printf'에게 스택에 대한 포인터를줍니다. – LiraNuna

+0

@LiraNuna - varargs 함수의 구현이 지정되지 않았기 때문에'#define va_copy (dest, src) dest = src' 또는'#define va_copy (dest, src) memcpy (dest, src, sizeof (va_list))'는'va_copy' 매크로가 제공되지 않는 시스템에서 이식성있는 대체물입니다. 그들 중 하나가 작동 할 수도 있지만 누가 알 수 있습니까? –

4

% d는 printf가 그 값을 int (부호가있는 것)로 해석한다는 것을 의미합니다. unsigned int이면 % u를 사용하십시오.

관련 문제