int类型表示范围的底层逻辑

在验证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

发现吻合,说明底层逻辑正确。

 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值