2012-06-25 2 views
2

GCC v4.4.5와 함께 일하고 있는데 예상하지 못한 기본 정수 승격 계획에 주목했습니다.GCC, 이상한 정수 승격 계획

암시 적 버그를 방지하기 위해 충분한 경고를 활성화하려면 -Wconversion 옵션을 활성화하고 그 이후로 아래 코드를 수행 할 때 경고문 "int에서 'short int'로의 변환이 값 "이 있습니다.

signed short sA, sB=1, sC=2; 
sA = sB + sC; 

"SB + sC 여기"INT로 승진 한 후 짧은 서명 입니다 SA에 할당 된 것을 의미한다. 이 경고를 수정하려면 다음과 같이 캐스팅해야합니다.

signed short sA, sB=1, sC=2; sA = (signed short)(sB + sC); 

이 경고

또한 아래의 코드에 존재합니다.

signed short sA=2; 
sA += 5; 

오퍼레이터 이로써 + =을 제거함으로써 해결 될 수있다 .. I는 연산자를 사용할 수없는 다소 성가신 원인이

sA = (signed short)(sA + 1); 

+ =, - =.

필자는 GCC가 피연산자에 따라 올바른 정수 프로모션을 선택할 것으로 예상했습니다. 내 말은, SA = SB + sC 여기SA + = 5이 모두가 짧은 서명만큼 INT으로 승진 할 수 없습니다.

나는 기본적으로 INT에 홍보하는 오버 플로우 버그를 방지하지만 내가 INT 내 변수를 내 코드의 대부분을 주조하거나 변경해야 조금 짜증나 원인이 있다고 알고 있습니다.

이 정수 승격 계획을 나타 내기 위해 사용할 수있는 GCC 옵션이 있습니까?

도움 주셔서 감사합니다.

+0

나는 해결책이 없지만,'signed short' 대신'short'를 쓸 수 있습니다. 이렇게하면 약간 짜증나게 할 수 있습니다. 나는 아직도 그것을 괴롭히는 것을 인정한다. –

답변

2

이것은 gcc가 아니며 표준적인 C 의미 체계입니다. 6.3.1.1:2 당

, 정수 변환 계수보다 작거나 INT의 랭크와 동일 부호 인 INT은의 부호의 int에 따라 또는 unsigned int 변환되는 정수형 갖는 객체 또는 식 유형을 산술 표현식에 참여하기 전에.

C가 이런 식으로 동작하는 이유는 int 형식의 ALU 연산이 int 형식의 ALU 연산보다 비효율적 인 플랫폼을 허용하기 위해서입니다. int 값에서 모든 산술 연산을 수행하고 저장을 위해 short으로 다시 변환해야합니다.

+0

몇 년 전 Borland C++ 및 VIsual C++를 사용해 보았지만 경고없이 + = 연산자를 사용할 수있었습니다. 나는 GCC가 C 규칙을 엄격하게 지원한다는 것을 알고 있지만 전에는 그것을 본 적이 없다는 것을 알고있다. 짜증나. 답장을 보내 주셔서 감사합니다. –