2012-03-04 6 views
6

:데이터 타입 프로모션 다음 코드에서

#include "stdio.h" 
signed char a= 0x80; 
unsigned char b= 0x01; 


void main (void) 
{ 
    if(b*a>1) 
     printf("promoted\n"); 
    else if (b*a<1) 
     printf("why doesnt promotion work?"); 

    while(1); 
} 

나는 " '승진 예상 한 인쇄 될하지만 서명과 서명되지 않은 int와 데이터 유형과은을로 가질 수 있다면 왜 나던.?. 예상대로 양수, 0x01로로, 예를 들어, 0x80000000에와 b는 음수가, "승진"인쇄됩니다.

PLZ 날 문제가 무엇인지 이해하는 데 도움이!

답변

10

당신은 지저분한에 의해 체포했습니다 타입 - 승진 규칙 C.

C에서 int보다 작은 정수 유형의 중간 물은 자동으로 int으로 승격됩니다.

그래서 당신은 :

0x80 * 0x01 = -128 * 1 

0x80int를 입력하도록 확장 서명됩니다 :

0xffffff80 * 0x00000001 = -128 * 1 = -128 

그래서 결과는 -128이며, 따라서보다 1입니다.

당신이 유형 intunsigned int 사용

는 두 피연산자는 unsigned int에 승진. 0x80000000 * 0x01 = 0x80000000은 부호없는 정수가 1보다 큽니다.


그래서 여기가 일어나고 유형 프로모션의 나란히 비교입니다 : b*a 항상 == -128 때문에

(signed char) * (unsigned char) -> int 
(signed int) * (unsigned int) -> unsigned int 

(signed char)0x80  * (unsigned char)0x01 -> (int)   0xffffff80 
(signed int)0x80000000 * (unsigned int)0x01 -> (unsigned int)0x80000000 

(int)   0xffffff80 is negative -> prints "why doesnt promotion work?" 
(unsigned int)0x80000000 is positive -> prints "promoted" 

Here's a reference to the type-promotion rules of C.

+0

@ 신비로운 나는 너의 대답을 이해하지 못한다. 그것이 int 형으로 확장 된 서명을 받았다고해도, 나는 생각하지 않는다. 그러나 그것이한다고 가정 할 때, 왜 unsigned int로 승격되고, 제품은 + ve 번호가 아닌가? – Dom045

+0

+1 -이 답변은 긴 마일으로 훨씬 좋고/관련이 있습니다 (그래서 삭제했습니다) –

+0

@ Dom045 사양에 그렇게 나와 있기 때문에. 'signed char'와'unsigned char'는 모두'int'보다 낮은 타입입니다. 그래서 그들은 둘 다'int'로 승격 될 것입니다. 'signed int'와'unsigned int'의 경우, 표준은 양쪽 모두가'unsigned int'로 변환되도록 지시합니다. 규칙은 여기에서 찾아 낼 수있다 : https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules – Mysticial

2

printf("promoted\n"); 결코 를 실행하지 이유는 미만인 경우 1

a  b  
0x80 * 0x01 = -128 * 1