-127的补码是多少_补码的范围

-127的补码是多少_补码的范围要理解整数的二进制,我们先来看下熟悉的十进制。我们对十进制是如此熟悉,可能已忽略了它的含义。比如123,不假思索我们就知道它的值是多少。但其实123表示1×(10^2)+2×(10^1)+3×(10^0)(10^2表示10的二次方),它表示的是各个位置数字含义之和,每个位置的数字含义

要理解整数的二进制,我们先来看下熟悉的十进制。我们对十进制是如此熟悉,可能已忽略了它的含义。比如123,不假思索我们就知道它的值是多少。

但其实123表示1×(10^2)+2×(10^1)+3×(10^0)(10^2表示10的二次方),它表示的是各个位置数字含义之和,每个位置的数字含义与位置有关,从右向左,第一位乘以10的0次方,即1,第二位乘以10的1次方,即10,第三位乘以10的2次方,即100,以此类推。

换句话说,每个位置都有一个位权

,从右到左,第一位为1,然后依次乘以10,即第二位为10,第三位为100,以此类推。

2.1.1 正整数的二进制表示

正整数的二进制表示与此类似,只是在十进制中,每个位置可以有10个数字,为0~9,但在二进制中,每个位置只能是0或1。位权的概念是类似的,从右到左,第一位为1,然后依次乘以2,即第二位为2,第三位为4,以此类推。表2-1列出了一些数字的二进制与对应的十进制。

表2-1 二进制与对应的十进制

2.1.2 负整数的二进制表示

十进制的负数表示就是在前面加一个负数符号-,例如-123。但二进制如何表示负数呢?其实概念是类似的,二进制使用最高位表示符号位,用1表示负数,用0表示正数。但哪个是最高位呢?整数有4种类型byte、short、int、long,分别占1、2、4、8个字节,即分别占8、16、32、64位,每种类型的符号位都是其最左边的一位。为方便举例,下面假定类型是byte,即从右到左的第8位表示符号位。

但负数表示不是简单地将最高位变为1,比如:

1)byte a=-1,如果只是将最高位变为1,二进制应该是,但实际上,它应该是。

2)byte a=-127,如果只是将最高位变为1,二进制应该是,但实际上,它却应该是。

和我们的直觉正好相反,这是什么表示法?这种表示法称为补码表示法

,而符合我们直觉的表示称为原码表示法

,补码表示就是在原码表示的基础上取反然后加1。取反就是将0变为1,1变为0。负数的二进制表示就是对应的正数的补码表示,比如:

1)-1:1的原码表示是00000001,取反是,然后再加1,就是。

2)-2:2的原码表示是00000010,取反是,然后再加1,就是。

3)-127:127的原码表示是0,取反是,然后再加1,就是。

给定一个负数的二进制表示,要想知道它的十进制值,可以采用相同的补码运算。比如:,首先取反,变为0,然后加1,结果为0,它的十进制值为110,所以原值就是-110。直觉上,应该是先减1,然后再取反,但计算机只能做加法,而补码的一个良好特性就是,对负数的补码表示做补码运算就可以得到其对应正数的原码,正如十进制运算中负负得正一样。

对于byte类型,正数最大表示是0,即127,负数最小表示(绝对值最大)是,即-128,表示范围就是-128~127。其他类型的整数也类似,负数能多表示一个数。

负整数为什么要采用这种奇怪的表示形式呢?原因是,只有这种形式,计算机才能实现正确的加减法。

计算机其实只能做加法,1-1其实是1+(-1)。如果用原码表示,计算结果是不对的,比如:

1 -> 00000001

-1 ->

+ ——————

-2 ->

用符合直觉的原码表示,1-1的结果是-2,如果是补码表示:

1 -> 00000001

-1 ->

+ ——————

0 -> 00000000

结果是正确的。再如,5-3:

5 -> 00000101

-3 ->

+ ——————

2 -> 00000010

结果也是正确的。就是这样,看上去可能比较奇怪和难以理解,但这种表示其实是非常严谨和正确的,是不是很奇妙?

理解了二进制加减法,我们就能理解为什么正数的运算结果可能出现负数了。当计算结果超出表示范围的时候,最高位往往是1,然后就会被看作负数。比如,127+1:

127 -> 0

1 -> 00000001

+ ——————

-128 ->

计算结果超出了byte的表示范围,会被看作-128。

2.1.3 十六进制

二进制写起来太长,为了简化写法,可以将4个二进制位简化为一个0~15的数,10~15用字符A~F表示,这种表示方法称为十六进制,如表2-2所示。

表2-2 十六进制

可以用十六进制直接写常量数字,在数字前面加0x即可。比如十进制的123,用十六进制表示是0x7B,即123=7×16+11。给整数赋值或者进行运算的时候,都可以直接使用十六进制,比如:

int a = 0x7B;

Java 7之前不支持直接写二进制常量。比如,想写二进制形式的11001,Java 7之前不能直接写,可以在前面补0,补足8位,为00011001,然后用十六进制表示,即0x19。Java 7开始支持二进制常量,在前面加0b或0B即可,比如:

int a = 0b11001;

在Java中,可以方便地使用Integer和Long的方法查看整数的二进制和十六进制表示,例如:

System.out.println(Integer.toBinaryString(a)); //二进制

System.out.println(Integer.toHexString(a)); //十六进制

System.out.println(Long.toBinaryString(a)); //二进制

System.out.println(Long.toHexString(a)); //十六进制

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/16157.html

(0)
上一篇 2024年 9月 18日
下一篇 2024年 9月 18日

相关推荐

关注微信