为什么1<<31答案是负数?

img


1 << 31 不是 1乘2的31次方的意思么,为啥乘30次方时还是整数,乘到31次方就变负数了?讲下原理?

C++中默认的整型是有符号int类型,int类型占4个字节共32位,其中最高位是符号位,如果最高位是1,则表示负数。
1<<31的结果是0x80000000, 其中最高位为1,数值为负数,负数是按补码形式存储的,其对应的数值是取反码加1,即-(0x7FFFFFFF + 1)=-2147483648

1<<31的意思是向左位移31位,超出可以表示的数的范围

这种是人为规定,就好像,平常我们在负数的前面加一个符号一样,要想这个32位数能正常表示负数,那是不是说要有一个符号位?你可以把它规定到第1位为符号位也行,怎么规定都是可以的。当然把它定在最高位确实是最好的,也比较符合我们把符号写在数字前面的习惯。如果你希望得到无符号数,定义时加上unsigned就好了。表示的意义虽然不一样,但是实质存储的可能是相同的东西,就好像-1其实就是最大的无符号整数(相同位数来说),unsigned int(-1)就可以表示最大的那个无符号整数了。不明白的话,还是得先学习基础知识,一句两句说不清楚。

溢出了
C++中,int占用4字节,32比特,数据范围为-21474836482147483647[-2^312^31-1]。