|
发表于 2020-10-15 22:22:26
|
显示全部楼层
应该是编译器的一个 bug,若将 4294967295 改为 4294967296 ,则系统告警:warning C4305: 'initializing' : truncation from 'const __int64 ' to 'int '(初始化:将 _int64 类型赋值给 int,可能面临数据截断问题),由此可见,4294967295 是32位系统的最大值;
从下面的运算来看,处于边缘运算的编译器,对于有符号数,无符号的表示已经显得无力了,所以,第一句开始,n1 就等于 -1 了
- #include <stdio.h>
-
- int main()
- {
- int n1 = 4294967295; // 执行完此语句后,n1 = -1
- unsigned n2 = 4294967295; // 执行完此语句后,n1 = -1,n2 = 4294967295
- int m = 2147483647; // 执行完此语句后,n1 = -1,n2 = 4294967295,m = 2147483647,m + 1 = -2147483648
- printf("作为有符号数 int 类型输出:n1 = %d,n2 = %d\n",n1,n2); // 保持一条语句后的结果
- printf("作为无符号数 int 类型输出:n1 = %u,n2 = %u\n",n1,n2); // 保持一条语句后的结果
- printf("m = %d\n",m); // 保持一条语句后的结果
- m = m + 1; // 执行完此语句后,n1 = -1,n2 = 4294967295,m = -2147483648,m + 1 = -2147483647
- printf("m + 1 = %d\n",m); // 执行完此语句后,n1 = -1,n2 = 4294967295,m = -2147483648,m + 1 = -2147483647
-
- return 0;
- }
复制代码 |
|