int类型在内存中的存储方式、取值范围、溢出
存储方式
整型数据都以补码的形式储存在内存中。
使用补码能方便的进行运算,具体的方式本文就不做详细分析了,可参考https://blog.****.net/changgui5211/article/details/46779441
有符号类型最高位位符号位,0代表正数,1代表负数.
原码:
除了符号位,其余是数据的绝对值的二进制数
例子:若机器字长n等于8,则
[+1]原=0000 00001 [-1]原=1000 00001
[+127]原=0111 1111 [-127]原=1111 1111
[+45]原=0010 1101 [-45]原=1010 1101
反码:
正数的反码和补码都和原码一样. 负数的反码是除了符号位,其余的对其原码逐位取反
例子:若机器字长n等于8,则
[+1]反=0000 00001 [-1]反=1111 1110
[+127]反=0111 1111 [-127]反=1000 0000
[+45]反=0010 1101 [-45]反=1101 0010
补码
正数和原码一样,负数的补码=其反码+1
例子:若机器字长n等于8,则
[+1]补=0000 00001 [-1]补=1111 1111
[+127]补=0111 1111 [-127]补=1000 0001
[+45]补=0010 1101 [-45]补=1101 0011
取值范围:
-231 ~ 231-1 即 -2147483648 ~ 2147483647
int 占4个字节即32位,除去最高位的符号位,那么还剩31个空闲的位置可以折腾.如图:
因此:
取值范围在 -231 ~ 231-1 即 -2147483648 ~ 2147483647
可以看到int 的最大值就是2147483647,最小值是-2147483648,在C++ 头文件climits中定义了INT_MAX,与INT_MIN,其实就是上面两个数.还有类似的CHAR_MAX等.
溢出问题
考虑一种情况,INT_MAX是int类型能表示的最大数,那么如果INT_MAX+1使用int存会发生什么呢? (上溢) 同理,INT_MIN-1呢? (即下溢)
先看结果:
结果显示:
INT_MAX + 1 = INT_MIN;
INT_MIN - 1 = INT_MAX;
为什么会这样?
上溢
如图,上溢的情况:
如果疑惑为什么1000…0000表示INT_MIN? 即-231呢? 原因如下:
前面提到,整型数据都是以补码的形式储存的,对于负数,补码=反码+1;
[-231]原=100000…0000
[-231]反=111111…1111 (除符号位,其余取反)
[-231]补=100000…0000(反码+1,本来加上去,要进一位,但是由于符号位不变,进的那一位被抛弃)
同理
下溢
综上:
无符号整型unsigned int
无符号整型,也是32位,但是与int不同的是,他没有符号位,因此只能表示非负数.
取值范围: 0~232-1 即 0~4294967295
溢出问题:
分析方法类似.
如图: