为什么采用二进制(使用二进制可以干嘛)

这篇文章对二进制讲解的非常深刻,在此进行转发,以备后面复习。这里另外推荐另外一篇文章,加强学习进制转换

-128的8位补码是:1000 0000B,换算成十进制就是 128。

负数的补码,是用“模”计算出来的,即:

[X]补 = 256 - |X| = 256- |-128| = 128。

不要用“求反加一”来算,那只不过是一个经验公式而已。

一.反码的范围

反码表示法规定:正数的反码与其原码相同。负数的反码是对其原码逐位取反,但符号位除外。

在规定中,8位二进制码能表示的反码范围是-127~127。

-128没有反码。

那么,为什么规定-128没有反码呢?下面解释。

首先看-0,[-0]原码=1000 000,其中1是符号位,根据反码规定,算出[-0]反码=1111 1111,

再看-128,[-128]原码=1000 000,假如让-128也有反码,根据反码规定,则[-128]反码=1111 1111,

你会发现,-128的反码和-0的反码相同,所以为了避免面混淆,有了-0,便不能有-128,这是反码规则决定的。

二.原码 反码 补码的范围

8位二进制数。

原码 -127~127 -128呢???不是说-128有原码 是1000 0000吗??

反码 -127~127

补码 -128~127

对于n位二进制数:

你会发现,补码比其它码多一位,这是为什么呢?问题出在0上。

[ 0]原码=0000 0000, [-0]原码=1000 0000

[ 0]反码=0000 0000, [-0]反码=1111 1111

[ 0]补码=0000 0000, [-0]补码=0000 0000

你会发现, 0和-0的补码是一样的。即 0的补码只有一种表示。

这里解释一下[-0]补码是怎么得来的。

负数的补码就是反码整体加一。符号位上的进位舍弃。(所以,舍弃了符号位的补码的第一位是数值位,不是符号位,符号位舍弃了)

另外解释一下原码符号位和补码符号位的关系,补码的符号位不是保持原码的第一位不变,而是 符号位不变,[-0]反码的第一个1是符号位,尾数中的7个1是数值位,尾数加一后,数值位产生了进位,1111 1111 1=1 0000 0000(计算补码的过程中,并不是先保证第一位不变,而是保证符号位不变,保证补码规则是反码整体加一)。

所以,补码能表示的数的个数中,比原码反码少了一个,所以补码可以多表示一个真值为-128的数。

但是,多表示的这个数-128比较特殊,只有原码和补码,没有反码。

-128的补码是1000 0000。

java学习交流群: 737251827

三.-128的补码为什么是1000 0000

8位二进制的原值表达范围为:-127至127

共有256个组合序列 0000 0000 至1111 1111 。 128的原值在8位中是表达不出来的。

下面从两个角度理解-128的补码为什么是1000 0000.

(1)从补码的意义上去理解

因为:256-128=256 (-128)的补码 --机器中只有加法。减法会变成补码的加法。

而 256-128=128 所以 256 (-128)的补码=128 所以 (-128)的补码=256-128 =128 数学上, 128=1000 0000 故规定-128的补码为 1000 0000

注意:只是规定而已,下面还有原因。

8位二进制 的补码组合序列有256个 0000 0000 - 0111 1111 0 ~ 127 1000 0000 用来干啥好呢?

1000 0001 - 1111 1111 -1~-127

再看看这个规律表 原码 补码 值 0111 1111 0111 1111 127 0111 1110 0111 1110 126 ... .. 补码不断-1... 0000 0000 0000 0000 0 1000 0001 1111 1111 -1 1000 0010 1111 1110 -2 1000 0011 1111 1101 -3 ... .. 补码不断-1... 1111 1111 1000 0001 -127 无法表达 1000 0000 -128

于是就有了规定 1000 0000 定为 -128的补码 这种定法和上面数学层面的表述是一致的。

这样规定后,负数的补码在机器中就好算了。

计算方法上是: 将该负数取绝对值,再用二进制表示出这个绝对值 (不管符号位!) 对该二进制数进行取反加一操作就得到负数的补码了 (也就是求补操作!) -128 绝对值是 128 128的二进制表示为: 1000 0000 取反 0111 1111 加1 1000 0000 这就是-128的补码 这种办法算出的结果符合“规定值”。

四.

1字节 = 8位,所以它能表示的最大数当然是8位都是1(既然2进制的数只能是0或1,如果是我们常见的10进制,那就8位都为9,这样说,你该懂了?)

1字节的二进制数中,最大的数:11111111。

双字节共16位。 1111111111111111。双字节数最大值为:

1 * 215 1 *214 1* 213 1 * 212 1 * 211 1 * 210 …… 1 * 22 1 * 21 1* 20 = 65535

负数在计算机中如何表示呢?

这一点,你可能听过两种不同的回答。

一 种是教科书,它会告诉你:计算机用“补码”表示负数。可是有关“补码”的概念一说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切。再 者,用“补码”表示负数,其实是一种公式,公式的作用在于告诉你,想得到问题的答案,应该如何计算。却并没有告诉你为什么用这个公式就可以得到答案! -----我就是被这个弄混淆的

网站声明:本文,文章仅为传播更多信息之目的,如信息有误,请联系我们修改或删除,多谢。
© 版权声明
评论 抢沙发
加载中~
每日一言
不怕万人阻挡,只怕自己投降
Not afraid of people blocking, I'm afraid their surrender