int main(){
long a = 1684 * 2097152;
return 0;
}
上面的代码在编译过程中给出了以下警告:warning: integer overflow in expression of type 'int' results in '-763363328'
我知道我可以通过像1684u
一样使其中一个不签名来解决此问题。
我假设1684
和2097152
由于 C 中的晋升规则而分别晋升为int
, 然后编译器抱怨乘法结果对于有符号的整数来说太大了。但是,我的结果类型是一种64 bit long
,即使它已签名,也可以轻松适合结果。
那么晋升规则是不在乎结果类型吗?只关心中间类型,这是这里的int
?
有关整数类型的升级和转换的规则基于每个运算符进行。 因此,二进制*
运算符的结果具有类型,=
运算符的结果具有类型。
对于*
运算符,首先在两端执行整数提升。 由于两个操作数都已具有类型int
因此没有变化。 并且由于两个操作数具有相同的类型,即int
,不执行任何转换,结果的类型为int
。
对于=
运算符,右操作数将转换为左操作数的类型,并且生成的表达式具有左操作数的类型。
您对整数提升的解释是正确的。
long a = 1684L * 2097152;
return 0;
但是,如果显式指定类型,则错误将消失,因为第一个运算符现在是long