在leetcode上刷第七题时,提到32位的有符号二进制数表示的整数范围为:-2^31~2^31-1,那这是怎么来的呢?
首先对于计算机内存存储的二进制数,具体表示什么其实是交给人来决定的,如:
1000 0001
有符号数表示的是:-127
无符号数表示的是:129
对于有符号数,最高位用来表示该整数的符号,0表示正数,1表示负数。
如果是正数,直接将它的原码翻译成十进制即可:
如:
0000 0010
表示的是正数:
解读方式:
直接以2为权展开为十进制数即可:
1*2^1=2
如果是负数,则它是用补码表示的,如:
1000 0000
表示的是负数:
解读方式:
第一步:直接将最高位以外的其他位按2为权展开:0
第二步:求出除去最高位以后的7位表示的模:2^7=128
第三步:将第二步的结果减去第一步的结果:128-0=128
第四步:给第三步的结果加上负号:-128
因此,对于8位的有符号二进制数表示的范围(-128~127),即(-2^7~2^7-1)可以这样计算:
最小值: 1000 0000 表示-128
最大值: 0111 1111 表示127
同理,对于32位的有符号二进制数表示的范围,可以计算为:(-2^31~2^31-1)
在c++中,为了避免记忆这两个数,用两个宏来替代了:
INT_MAX=2^31-1
INT_MIN=-2^31