海湾合作委员会,奇怪的整数推广计划

时间:2012-06-25 10:01:38

标签: gcc integer-promotion

我正在使用GCC v4.4.5并且我没有注意到我没想到的默认整数提升方案。

要激活足够的警告以防止隐式错误,我激活了选项-Wconversion,从那时起我就注意到当我执行下面的代码时,警告“从'int'转换为'short int'可能会改变它的价值“存在。

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

这意味着“sB + sC”升级为 int ,然后分配给 sA 签名短 EM>。 要修复此警告,我必须像这样投射它。

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 ,因为它们都是签名短

我理解默认情况下升级到 int 可以防止溢出错误,但这有点烦人,因为我必须将大部分代码转换为 int 。< / p>

我可以使用GCC选项来呈现此整数提升方案吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这不是gcc,这是标准的C语义。

按照6.3.1.1:2,具有整数类型的对象或表达式,其整数转换等级较小 在参与算术表达式之前,取决于类型的有符号性,将等于或等于int和unsigned int 的等级转换为intunsigned int

C以这种方式运行的原因是允许对子int类型的ALU操作效率低于完全int类型的ALU操作的平台。您应该对int值执行所有算术运算,并仅转换回short进行存储。