为什么Java中Ineger类型能记录的最大值是2^31-1,而最小值是-2^31?

1

基础回顾

给定一个正整数p,任意一个整数n,一定存在等式:n=kp+r

其中k,r是整数,其0≤r<p,称k为n除以p的商,r为n除以p的余数

 

对于正整数和整数,定义如下运算

取模运算:a % p(或a mod p),表示a除以p的余数

 

2

场景带入

假设你有一块带指针手表比正常时间快了2个小时,现在你想校对,有至少两种方案:

  1. 逆时针调回2个小时

  2. 顺时针调快10(12-2)个小时

 

假设目前时间为4点,你的手表时间为6点,则有:

1) 6-2=4%12=4

2) 6+(12-2)=16%12=4

 

记逆时针表示负,顺时针表示为正

∵ 钟表是按12进位的

∴11是最大的,12点也叫0点

即12=0=11(最大值)+1,12就是它的"模"

对于模12来说,-2与+10是"同余"的,-2与+10对于模12来互为补数

其本质就是一个环

 

3

最小值

回到正题,这个环中有一半的数为正,一半的为负数,把0归为正的一半中。所以最小的负数就是-2^32/2=-2^31

 

4

最大值

欲求最大值,首先得是正数,即符号位为0,其余位全为1,所以最大值为

01111111 11111111 11111111 11111111 

转为十进制则为

640?wx_fmt=png

所以 Java中Integer类型课表示的最大值是2^31-1

 

5

补充

正数的补码是其本身,这里主要说明负数的情况 

∵ [-X]补=K-X

   假设X为Byte类型且值为2,用二进制表示则有: 

   X=00000010,模=11111111+00000001

   [-X]补=11111111+00000001-00000010

            =11111111-00000010+00000001

    =11111101+00000001

    =11111110

即-2的补码为11111110

这就是所谓的“按位区反再加1”的过程,如下图

 

640?wx_fmt=png

6

题外话

  • Java语言规范规定Ineger类型为4字节,不管是32/64位机器,这就是其跨平台的基础部分

  • 把某数X加上模数K,称为以K为模的X的补码

  • 计算机中的加法器是以2^n(n位)为模的有模器件,故引入补码,把减法运算转换为加法运算,以简化运算器的设计

  • 负数的补码与对应正数的补码之间的转换可以用同一种方法——求补运算

  • 可将减法变为加法,省去减法器

  • 无符号数及带符号数的加法运算可以用同一电路完成

转载于:https://my.oschina.net/william5/blog/1931400

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值