傲视群熊¥ 发表于 2020-10-15 21:09:51

小白求助

最后的m+1为什么输出的是-2147483648?

永恒的蓝色梦想 发表于 2020-10-15 22:18:09

符号整数溢出

乐乐学编程 发表于 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;
}

永恒的蓝色梦想 发表于 2020-10-17 21:27:15

乐乐学编程 发表于 2020-10-15 22:22
应该是编译器的一个 bug,若将 4294967295 改为 4294967296 ,则系统告警:warning C4305: 'initializing'...

4294967295 是32位系统的最大值你这话说滴不是很明确啊

乐乐学编程 发表于 2020-10-18 07:34:48

永恒的蓝色梦想 发表于 2020-10-17 21:27
你这话说滴不是很明确啊

那要怎么说呢?

永恒的蓝色梦想 发表于 2020-10-18 12:43:54

乐乐学编程 发表于 2020-10-18 07:34
那要怎么说呢?

“32位系统的最大值”什么叫系统的最大值?
页: [1]
查看完整版本: 小白求助