int取值范围问题
看了好多大佬的评论以及回复,稍微懂了这么一点点,总结一下
首先谈一下int的取值范围问题
众所周知一个字节也就是1byte 取值范围=-2^7 ~ 2^7-1也就是-128~127,再看一下int类型,一个int类型占几个字节首先要看你是什么操作系统
16位的操作系统一个int占2个字节
32位和64位的操作系统一个int占4个字节
反正现在基本都用32位和64位,我就说一下这个吧
一般它们都长这样
0000 0000 0000 0000 0000 0000 0000 0001 |
---|
至于为什么是-2^31 ~ 2^31-1百度搜去,很多文章
最左边的一位是符号位0为正,1为负
由此可得int取值范围就是-231~231-1
int溢出问题
不要觉得这样就完了,不可能,上面放的是原码,咱们计算机储存都是靠补码储存的
简单介绍一下以下这三个东西
原码,反码,补码
正数 | 负数 | |
---|---|---|
原码 | 计算机中对数字的二进制定点表示方法 | 计算机中对数字的二进制定点表示方法 |
反码 | 等于原码 | 除符号位外按位取反 |
补码 | 等于原码 | 反码+1 |
举个例子
正数 1 | 负数1 | |
---|---|---|
原码 | 0000 0000 0000 0000 0000 0000 0000 0001 | 1000 0000 0000 0000 0000 0000 0000 0001 |
反码 | 0000 0000 0000 0000 0000 0000 0000 0001 | 1111 1111 1111 1111 1111 1111 1111 1110 |
补码 | 0000 0000 0000 0000 0000 0000 0000 0001 | 1111 1111 1111 1111 1111 1111 1111 1111 |
int 的正数最大值就是(补码)
0111 1111 1111 1111 1111 1111 1111 1111 |
---|
现在+1,也就是
0111 1111 1111 1111 1111 1111 1111 1111+0000 0000 0000 0000 0000 0000 0000 0001 |
---|
结果就是 1000 0000 0000 0000 0000 0000 0000 0000 也就是就是-0的补码 |
将-0转回原码,发现溢出了,所以,-0没有原码,然后就把-0规定为int的最小值,也就是-2^31
不信可以再+1,也就是
1000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0001 |
---|
结果就是1000 0000 0000 0000 0000 0000 0000 0001 |
转成原码就是1111 1111 1111 1111 1111 1111 1111 1111也就是-2^31-1,不信用计算器算,哈哈 |
得出结论