【发布时间】:2018-09-12 01:09:18
【问题描述】:
在我的机器中,整数数据类型的大小是 4 个字节,所以在有符号整数的情况下,正侧的最大值是 2147483647,负侧的最大值是 -2147483648。考虑下面的c程序
#include<stdio.h>
int main(void)
{
int a = 2147483648;
int b = -2147483649;
printf("%d",a);
printf("\n%d",b);
return 0;
}
输出: -2147483647 2147483647
为什么 a 隐式转换为 -2147483648 而 b 隐式转换为 2147483647?以及为什么我只收到第 2 行的以下警告
“隐式常量转换中的溢出(-woverflow)”
【问题讨论】:
-
这可以通过了解 2 的补码编码的工作原理来解释。 stackoverflow.com/questions/1049722/what-is-2s-complement
-
有符号整数的上溢和下溢未定义。
-
1.整数溢出是未定义的行为。您不应该期望从这些分配中获得一致的结果。 2. 你的结果 1&2 对我来说似乎很直观(如果我要定义所需的行为,那就是它的样子)。不过,我不确定丢失的警告。这似乎不受欢迎 :)
-
@zzyzx 此代码中没有 UB。如果在相同的实现上重新运行代码,您应该期望得到一致的结果。
标签: c