2012-06-26 13 views
7

Bitshift and integer promotion?과 비슷한 질문에 왼쪽 비트 시프트를 사용할 때 정수 승격에 대한 질문이 있습니다. 이 경우연산자로 정수 승격 <<

unsigned int test(void) 
{ 
    unsigned char value8; 
    unsigned int result; 

    value8 = 0x12; 
    result = value8 << 8; 
    return result; 
} 

는 value8 먼저 unsiged INT를 촉진하거나 특정 구현 될 것인가?

6.5.7 비트 시프트 연산자 ... 3 Sematics을 ...
정수 프로모션 피연산자의 각각에 수행된다. 결과 유형은 승격 된 왼쪽 피연산자의 유형입니다. 입니다. 오른쪽 피연산자의 값이 음수이거나 승격 된 왼쪽 피연산자의 너비보다 크거나 같은 인 경우 동작은 정의되지 않습니다.

"정수 승격은 각 피연산자에 대해 수행됩니다.",하지만 여기에 프로모션 규칙은 무엇입니까?

나는 그것이 convert to int if lesser rank than int이어야한다고 가정하지만, 그것을 찾을 수 없습니다.

하나의 컴파일러 (Renesas nc30wa)가 int로 승격되지 않으므로 필자의 질문에 항상 결과가 0입니다.

이 플랫폼에서 char는 8 비트 폭이며 int 16 비트입니다.

+2

value8이 승격되지 않으면 컴파일러 버그입니다. –

+1

Excactly 그것이 질문입니까, 버그입니까 구현입니까? – jeb

+0

@jeb 내 대답에 편집을 참조하십시오. 일부 컴파일러는 기본적으로 정수 판촉을 비활성화하고 컴파일러 설명서에 문서화합니다. 컴파일러 설명서에서 ISO 적합성을 찾아야합니다. – ouah

답변

12

문구 "정수 프로모션"(C99의 경우)에서 발견되는 매우 구체적인 것, 섹션 6.3.1.1 Booleans, characters, and integers입니다 :

하는 int 원래 유형의 모든 값을 나타낼 수있는 경우, 값은 변환됩니다 int; 그렇지 않으면 서명되지 않은 int로 변환됩니다. 이를 정수 프로모션이라고합니다. 다른 모든 유형은 정수 승격에 의해 변경되지 않습니다.

그래서 가정하여 unsigned charint 유지 될 수있다, 그것은가 int로 승격됩니다. 희귀 플랫폼의 경우 unsigned charint만큼 넓 으면 unsigned int으로 승격됩니다.

은 C11 약간 변경된다 : (a 비트 필드의 폭 제한 등) INT 원래 형태의 모든 값을 나타낼 수

경우 값은 변환되고 int; 그렇지 않으면 부호없는 int로 변환됩니다.이것을 정수 승격이라고합니다. 정수 승격 에 의해 다른 모든 유형은 변경되지 않습니다.

특정 컴파일러가이 동작을 따르지 않으면 실제로 적합하지 않습니다. 그러나 나열된 컴파일러가 임베디드 시스템 용이므로 실제로는 놀라운 것이 아닙니다.

많은 것은 특정 목적을 위해 만들어졌으며 요구 사항 목록에서 항상 일치하지는 않습니다. 표준에보다 가깝게 따르도록 컴파일러 플래그가있을 수 있습니다. (-fETI)

-fextend_to_int :


섹션 2.1.4 nc30 Command Line Options, 하위 f. Generated code modification options에서 M16C Series,R8C Family C Compiler Package V.5.45 C Compiler있다 (here 참조) 특정 환경을 보면
          char 형의 데이터를 int 형에 확장 한 후에 조작을 실행합니다. ANSI 표준에 따라 확장되었습니다.

비록 내가 의심 할 여지가 있지만 -fansi이 아마도 다른 몇 가지를 다루기 때문에 더 나은 선택 일 것입니다.

3

value8unsigned char의 변환 등급 int의 변환 계수 (대부분의 플랫폼에 일반적인 경우) 미만인 가정 int로 승격된다.

정수의 변환 순위는 6.3.1.1의 C99에 설명되어 있습니다.

일부 컴파일러는 기본적으로 정수 판촉 규칙을 비활성화합니다. 예를 들어 MicroChip 컴파일러 MPLAB C18. 컴파일러의 설명서에서 ISO 적합성을 찾으십시오.

관련 문제