GCC,奇怪的整数提升方案
Posted
技术标签:
【中文标题】GCC,奇怪的整数提升方案【英文标题】:GCC, weird integer promotion scheme 【发布时间】:2012-06-25 10:01:38 【问题描述】:我正在使用 GCC v4.4.5,并且我发现了一个我没想到的默认整数提升方案。
为了激活足够的警告以防止隐式错误,我激活了选项 -Wconversion,从那时起,我注意到当我执行下面的代码时,警告 "conversion to 'short int' from 'int' 可能会改变它的值” 存在。
signed short sA, sB=1, sC=2;
sA = sB + sC;
这意味着 "sB + sC" 被提升为 int 然后分配给 sA 这是 signed short时间>。 要修复此警告,我必须像这样投射它。
signed short sA, sB=1, sC=2;
sA = ( signed short )( sB + sC );
以下代码也存在此警告。
signed short sA=2;
sA += 5;
并且可以通过移除操作符+=来修复...
sA = ( signed short )( sA + 1 );
这有点烦人,因为我不能使用运算符 +=、-=。
我希望 GCC 根据操作数选择正确的整数提升。我的意思是,sA=sB+sC 和 sA+=5 不应提升为 int,因为它们都是 signed short em>。
我知道默认情况下提升为 int 可以防止溢出错误,但这有点烦人,因为我必须强制转换大部分代码或将变量更改为 int。
我可以使用 GCC 选项来展示这个整数提升方案吗?
感谢您的帮助。
【问题讨论】:
我没有解决方案,但您始终可以写成short
而不是完整的signed short
,这样可能会稍微不那么烦人。我承认它仍然很烦人。
【参考方案1】:
这不是 gcc,这是标准 C 语义。
根据 6.3.1.1:2,具有整数类型的对象或表达式,其整数转换等级小于
大于或等于 int 和 unsigned int 的等级在参与算术表达式之前根据类型的有符号性转换为int
或unsigned int
。
C 以这种方式运行的原因是允许在 sub-int
类型上的 ALU 操作比在完整 int
类型上的 ALU 操作效率低的平台。您应该对 int
值执行所有算术运算,然后转换回 short
仅用于存储。
【讨论】:
几年前我曾经使用过 Borland C++ 和 VIsual C++,我能够在没有任何警告的情况下使用运算符 +=。我知道 GCC 严格支持 C 规则,但我以前从未见过。它很烦人。感谢您的回复。以上是关于GCC,奇怪的整数提升方案的主要内容,如果未能解决你的问题,请参考以下文章