2013-07-26 4 views
6

는 가정 다음부호없는 char은 항상 int로 승격됩니까?

unsigned char foo = 3; 
unsigned char bar = 5; 

unsigned int shmoo = foo + bar; 

보장 foobar 값은 표현 foo + bar의 평가를 위해 int 값으로 승진 할 수 있는가 - 또는 구현 unsigned int에게 홍보 할 수 있습니다?

섹션 6.2.5제 8 절 : 동일한 부호의 다른 정수 변환 계수 (6.3.1.1 참조) 유형 값의 범위로 임의의 두 정수 유형의

더 작은 정수 변환 순위는 다른 유형의 값의 하위 범위 인 입니다.

9 단락 6.2.5 절에서:

int 원래 타입의 모든 값을 나타낼 수있는 경우, 그 값은 int로 변환된다; 그렇지 않으면 unsigned int으로 변환됩니다.

작은 정수 변환 순위 정수 타입은 다른 타입의 값의 하위 범위 인 값의 범위를 갖는 것을 보장 정수형의 부호의에 의존하는 것으로 보인다.

  • signed charsigned int
  • unsigned char에 해당이는 unsigned char의 값 만 unsigned int의 부분 범위에서 보장하고 반드시 int 것을 뜻 unsigned int

에 해당? 그렇다면 구현시 이론적으로 unsigned char 값이 int의 하위 범위에 있지 않음을 의미합니까?

+0

[Deep C : Integer Promotion] (http://www.idryman.org/blog/2012/11/21/integer-promotion/) –

+0

대답하지 않습니까? –

+0

int가 8 비트 인 시스템을 찾지 못하면 6.2.5 절에서 9 절이 작동해야합니다. – hetepeperfan

답변

8

은 unsigned int로 승격시킬 수있는 구현입니까? (C99에서 6.2.5p9에 의해 통치로) 모든 unsigned char 값이 int에서 표현할 수 있습니다하지 않을 경우

구현 unsigned int을 추진합니다. 구현 예는 아래를 참조하십시오.

그렇다면 구현이 이론적으로 int의 하위 범위에없는 부호없는 char 값을 가질 수 있다는 것을 의미합니까?

예 : CHAR_BIT 16 또는 32의 DSP cpu예를 들어

,의 TMS320C55x에 대한 TI의 C 컴파일러 : CHAR_BIT이 16 UCHAR_MAX 65535, UINT_MAX 65535하지만 INT_MAX 나는이 어제 가로 질러 32767

http://focus.ti.com/lit/ug/spru281f/spru281f.pdf

+0

나는이 가능성이'char'의 모든 값이'int'에 맞아야하기 때문에'char'가 서명 될 수 있어야만하는 이유라고 믿습니다. 반대로, C 문자 집합의 모든 구성원이 일부 컴파일러에서 'char'을 부호가 없도록해야합니다 (예 : EBCDIC에서 숫자 0-9가 0xF0-0xF9 임). – supercat

+0

만약 내가'int x = 1234'와'char * y = & x'와 같은 것을 가지고 있다면. '1234'의 이진 표현은'00000000 00000000 00000100 11010010'입니다. 내 컴퓨터는 리틀 엔디 언 (little endian)이므로 역순으로 메모리에 저장한다.'11010010 00000100 00000000 00000000' LSB가 먼저 온다. 이제 주요 부분. 내가'printf ("% d", * p)'를 사용한다면. 'printf'는 첫 번째 바이트 인'11010010'을 출력합니다. 출력은'-46'이지만'11010010'은'210'입니다. 왜'-46'을 출력합니까? 나는 정수 승진에 약간 차가 무언가를하고 있다는 것을 그러나 나가 모른다는 것을 진짜로 혼동한다. –

+0

@SurajJain 나는 당신이'printf ("% d", * y)'라고 생각한다. 'd' 지정자는 부호있는 값을 쓰고'11010010'은 2의 보수 표현에서'-46'입니다. 'printf ("% d", (unsigned char) * y)'를 사용하여 부호없는 값을 씁니다. 더 많은 질문이 있으면 stackoverflow 질문을 열어 볼 수 있습니까? – ouah

0

입니다 - 내 대답은 주제에 바랍니다.

uint8_t x = 10; 
uint8_t y = 250; 

if (x - y > 0) { 
    // never happens 
} 

if (x - y < 0U) { 
    // always happens 
} 

적어도 x와 y 값은 예기치 않게 승격되는 것처럼 보였습니다. 사실 승격 된 결과였습니다.

+0

나는 네가하는 말을 이해하지 못한다. x와 y는 모두 int로 승격되기 때문에 -240을 가져야합니다. 그런 다음 비교를 위해 서명되지 않은 상태로 승격됩니다 (4294967056 <0U). 절대 발생하지 않아야합니다. – newguy