整数提升规则不关心结果类型吗?


int main(){
long a = 1684 * 2097152; 
return 0;
}

上面的代码在编译过程中给出了以下警告:warning: integer overflow in expression of type 'int' results in '-763363328'

我知道我可以通过像1684u一样使其中一个不签名来解决此问题。

我假设16842097152由于 C 中的晋升规则而分别晋升为int, 然后编译器抱怨乘法结果对于有符号的整数来说太大了。但是,我的结果类型是一种64 bit long,即使它已签名,也可以轻松适合结果。

那么晋升规则是不在乎结果类型吗?只关心中间类型,这是这里的int

有关整数类型的升级和转换的规则基于每个运算符进行。 因此,二进制*运算符的结果具有类型,=运算符的结果具有类型。

对于*运算符,首先在两端执行整数提升。 由于两个操作数都已具有类型int因此没有变化。 并且由于两个操作数具有相同的类型,即int,不执行任何转换,结果的类型为int

对于=运算符,右操作数将转换为左操作数的类型,并且生成的表达式具有左操作数的类型。

您对整数提升的解释是正确的。

long a = 1684L * 2097152; 
return 0;

但是,如果显式指定类型,则错误将消失,因为第一个运算符现在是long

最新更新