在验证int的表示范围时所得,记录一下。
整形int的表示范围是:-2^31~2^31-1
输入一段代码:
printf(“%d”,1<<31);
输出结果为:-2147483648
为何是负的呢?(即解释为什么int最大范围要减一)
1<<31用计算机二进制表示为:
1 00000 00000 00000 00000 00000 00000
最左边的是符号位,1为负0为正,且在计算这一位是是要乘上负号的,而其它正位是要乘上正号的,以下面这个例子来说明:
printf(“%d”,(1<<31)+1);
输出结果为:-2147483647
我们从计算机二进制来看看它们是如何运算的
1<<31:
1 00000 00000 00000 00000 00000 00000
1:
0 00000 00000 00000 00000 00000 00001
相加:
1 00000 00000 00000 00000 00000 00001
转换为十进制:
+1*2^0 + ...... + (-1)*2^31
现在应该知道了乘正号负号是什么意思了,以及为什么最大不是2^31,因为那是个负数!
那么现在来解释,为什么2^31-1就是个正数:
1<<31:
1 00000 00000 00000 00000 00000 00000
-1:(默认采用补码进行存储)
1 11111 11111 11111 11111 11111 11111
相加:
0 11111 11111 11111 11111 11111 11111
用一段代码算出这个数转换为十进制是多少:
int sum=0 , i=1 , t=1 ;
for (t=1 ; t<31 ; t++){
i *=2 ;
sum +=i ;
}printf(“%d”,sum + 1);
输出结果为:2147483647
再输入一段代码:
printf(“%d”,1<<31-1);
输出结果为:2147483647
发现吻合,说明底层逻辑正确。