我正在使用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选项来呈现此整数提升方案吗?
感谢您的帮助。
答案 0 :(得分:2)
这不是gcc,这是标准的C语义。
按照6.3.1.1:2,具有整数类型的对象或表达式,其整数转换等级较小
在参与算术表达式之前,取决于类型的有符号性,将等于或等于int和unsigned int 的等级转换为int
或unsigned int
。
C以这种方式运行的原因是允许对子int
类型的ALU操作效率低于完全int
类型的ALU操作的平台。您应该对int
值执行所有算术运算,并仅转换回short
进行存储。