首先说一下我原来错误的认识
int是32个bit,
如果我们把第一位理解为符号位,那么很显然int的范围是-(2^31-1)~2^31-1
但是实际上我们都知道int的最小值是-2^31次。。
为什么会这样呢。。首先对于这个问题困惑的话说明你的逻辑不够强
因为如果第一位是符号位那么上面的分析必然是正确的。。而且按照上面的表示方法,我们显然可以发现
有两个零,一个是+0,一个是-0
然而实际上好像并没有这么一说
所以说。。从这里。。正常的逻辑思维应该得出一个结论。。那就是c语言的int表示方法并不是我们想的那样
那么我们用x表示一个值。。+,-符号来表示正负号,等号右侧用来表示这个数在计算机里存储的值。。我们都知道计算机是没法存储正负号的(硬件)(额似乎不太恰当)
那么根据int的表示方法的hash他是怎么工作的呢
+x=x
-x=~(x)+1
除了要注意按位取反表达式。。我们还要注意需要把规定位数的两个数每一位对齐。。高位和过低都截断(?)
那么这样我们就可以发现。。-(2^31)=~(2^31)+1
这个太长啦。。我们举一个短一点的例子来算一下
-(2^3)=~(2^3)+1=2^3
-1000=0111+1=1000
哇哦好神奇。。这个就是4位数能表示的最小负数。。4位可以表示的最小负数可以用2^3来表示
那么同理。。32位整数能表示的最小负数就可以用2^31来表示。。显然可以存下的啊
所以说经过计算我们就发现了。。int的范围是-(2^31)~(2^31-1)