Java中byte类型的取值范围为什么是 -128 到 127 ?

在计算机内,定点数有3种表示法:原码、反码和补码

原码 :二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码 :正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码 :正数的补码与其原码相同;负数的补码是将其原码的除符号位外的所有位,逐位取反,然后加1。

 

Java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。

正数的补码是其本身;
负数的补码是将其原码的除符号位外的所有位,逐位取反,然后加1。

例如:
+21,其源码是00010101,则其补码同样为00010101。
-21,按照其源码为10010101,除符号位外 逐位取反得到11101010,再加1得到11101011。即-21的二进制表示形式为11101011
 


byte类型的最大值为什么是127?

byte为一字节8位,正数最高位是符号位为0,即最大值的原码是01111111。又因为正数的补码是其本身,所以最大的正数的补码为01111111,十进制表示形式为127 。


byte类型的最小值为什么是 -128?

计算机强行规定了最小值是-128,其补码为10000000,且-128是没有原码和反码的。

 

"+0"的补码是00000000,那么“-0”的补码即10000000该怎么处理呢? 总不能浪费一个位置吧。于是计算机就把“-0”的位置给了“-128”。也就是计算机规定了补码1000 0000代表-128

其实这么设计也是很巧妙的:

(1)

127(0111 1111)加1(0000 0001)刚好得到-128(1000 0000)。

-128(1000 0000)加1(0000 00001)等于-127(1000 0001)。

这样从-128~127的补码首尾相连,形成了一个闭环,像时钟一样,一圈一圈的轮回。

(2)

在计算机中减法运算可以转换成加法运算,比如8-1——>8+(-1)——>补码运算:(0000 1000) + (1111 1111) = (0000 0111) 刚好是7。-128+127——>(1000 0000) + (0111 1111) = (1111 1111)刚好是-1,-128的补码完美的适用于减法。

 


总结

 

 原码反码补码
1270111111110111111101111111
0000000000000 00000000 0000
-1100000011111111011111111
-127111111111000000010000001
-128  10000000

 


参考文献

https://www.jianshu.com/p/47761557bab0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值