|  | 
 
 发表于 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;
}
 | 
 |