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+sCsA+=5 不应提升为 int,因为它们都是 signed short em>。

我知道默认情况下提升为 int 可以防止溢出错误,但这有点烦人,因为我必须强制转换大部分代码或将变量更改为 int

我可以使用 GCC 选项来展示这个整数提升方案吗?

感谢您的帮助。

【问题讨论】:

我没有解决方案,但您始终可以写成short 而不是完整的signed short,这样可能会稍微不那么烦人。我承认它仍然很烦人。 【参考方案1】:

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

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

C 以这种方式运行的原因是允许在 sub-int 类型上的 ALU 操作比在完整 int 类型上的 ALU 操作效率低的平台。您应该对 int 值执行所有算术运算,然后转换回 short 仅用于存储。

【讨论】:

几年前我曾经使用过 Borland C++ 和 VIsual C++,我能够在没有任何警告的情况下使用运算符 +=。我知道 GCC 严格支持 C 规则,但我以前从未见过。它很烦人。感谢您的回复。

以上是关于GCC,奇怪的整数提升方案的主要内容,如果未能解决你的问题,请参考以下文章

GCC 中有固定大小的整数吗?

C/C++ 单元自动化测试解决方案实践

使用与其他来源不同的编译器来提升编译

将两个整数相除时,Clang 会产生奇怪的输出

奇怪的数组初始化表达式?

GCC 和 clang 上的 MSVC /Zp 替代方案是啥?