底层存储
1.1 int其实范围是-2147483648到2147483647,我们看看计算机底层怎么存储的呢?先是有一个符号位,int为4个字节
最大值:0111 1111 1111 1111 1111 1111 1111 1111 还有一个0
存储 0111 1111 1111 1111 1111 1111 1111 1111
最小值1111 1111 1111 1111 1111 1111 1111正数表达了0;所以负数多一个0
存储 1000 0000 0000 0000 0000 0000 0000 0001 补码存储
int超出范围,撑爆循环
1.1 那么,接下来我们看看“撑爆”循环的代码
我们可以看到,不能直接定义int类型变量并且超出范围(注释部分);但是为什么m,n不报错。来,让我们看看底层干了些啥子!
n: 0111 1111 1111 1111 1111 1111 1111 1111
6: 0000 0000 0000 0000 0000 0000 0000 0110
补码相加:11000 0000 0000 0000 0000 0000 0000 0101
第一位被淘汰出去,超出4位字节,1继续承担符号位
得到:1000 0000 0000 0000 0000 0000 0000 0101 底层补码
原码:1111 1111 1111 1111 1111 1111 1111 1011 实际表示数字
实际表达数字:-2147483643
所以,我们可以直接想象为是一个“撑爆”循环就可以了
要不再看看负数?
-2147483648补码
1000 0000 0000 0000 0000 0000 0000 0001
-5补码
1111 1111 1111 1111 1111 1111 1111 1010
补码相加
10111 1111 1111 1111 1111 1111 1111 1011
去掉越界的1;0再作为符号位
得到的就是 0111 1111 1111 1111 1111 1111 1111 1011
表示2147483643