int类型在内存中的存储方式、取值范围、溢出

存储方式

整型数据都以补码的形式储存在内存中。
使用补码能方便的进行运算,具体的方式本文就不做详细分析了,可参考https://blog.csdn.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

在这里插入图片描述在这里插入图片描述

溢出问题:

分析方法类似.
如图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/K__Ming/article/details/107524000