[置顶] 为什么-128用二进制表示为1000000000000000?
2017-11-15 21:53
375 查看
-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。 三.-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进制的一切。再 者,用“补码”表示负数,其实是一种公式,公式的作用在于告诉你,想得到问题的答案,应该如何计算。却并没有告诉你为什么用这个公式就可以得到答案! -----我就是被这个弄混淆的>_<另 一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是0,表示正数,最高位是1,表示负数。这种说法本身没错,可是如果没有下文,那么它就是 错的。至少它不能解释,为什么字符类型的-1用二进制表示是“1111 1111”(16进制为FF);而不是我们更能理解的“1000 0001”。(为什么说后者更好理解呢?因为既然说最高位是1时表示负数,那1000 0001不是正好是-1吗?-----re!当初偶就是这么想的,so一直在脑中打架,越打越混淆=,=)。让我们从头说起。2.1、你自已决定是否需要有正负。就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。在计算机中,可以区分正负的类型,称为有符类型,无正负的类型(只有正值),称为无符类型。数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有有符类型。字符类型也分为有符和无符类型。比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。 3、无符号数和有符号数的范围区别。 同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一位,最大值一下子减半。不过,有符号数的长处是它可以表示负数。因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍一个字节的数值对比:无符号数: 0 ----------------- 255有符号数: -128 ----- 0 ----- 127 同样是一个字节,无符号的最小值是 0 ,而有符号数的最小值是-128。所以二者能表达的不同的数值的个数都一样是256个。只不过前者表达的是0到255这256个数,后者表达的是-128到+127这256个数。一个有符号的数据类型的最小值是如何计算出来的呢?有符号的数据类型的最大值的计算方法完全和无符号一样,只不过它少了一个最高位(见第3点)。但在负值范围内,数值的计算方法不能直接使用1* 26 + 1* 25 的公式进行转换。在计算机中,负数除为最高位为1以外,还采用补码形式进行表达。所以在计算其值前,需要对补码进行还原。这里,先直观地看一眼补码的形式:以我们原有的数学经验,在10进制中:1 表示正1,而加上负号:-1 表示和1相对的负值。那么,我们会很容易认为在2进制中(1个字节): 0000 0001 表示正1,则高位为1后:1000 0001应该表示-1。然而,事实上计算机中的规定有些相反,请看下表:
二进制值(1字节) | 十进制值 |
1000 0000红色的1代表负数蓝色的是补码(补码=反码+1) | -128 |
1000 0001蓝色部分代表多大的值?:将补码还原为原码 | -127想化成负数?:先减去1再按位取反 |
1000 0010还原方法:补码-1再取反 | -126 |
1000 0011 | -125 |
... | ... |
1111 1110 | -2 |
1111 1111 | -1 |
字节数 | 二进制值 | 十进制值 |
单字节数 | 1111 1111红色表示负数蓝色部分的补码为值1 | -1 |
负数:原码就是原来的表示方法、反码是除符号位(最高位)外取反、补码=反码+1双字节数 | 1111 1111 1111 1111 | -1 |
四字节数 | 1111 1111 1111 1111 1111 1111 1111 1111 | -1 |
相关文章推荐
- 为什么八位二进制表示范围为-128~127?
- 十进制的0.1 为什么不能用二进制很好的表示?
- 解读为什么有符号的char可表示范围是-128~+127
- 补码10000000为什么可以表示-128?
- 【转】为什么0.1无法被二进制小数精确表示?
- 为什么8位二进制的补码取值范围是-128~127
- 八位二进制数为什么表示范围是:-128~~+127?
- [置顶] day03.计算机为什么使用二进制
- 八位二进制数为什么表示范围(-128~~+127)理解
- 单精度浮点数的二进制表示时 指数为什么要加上127的偏移量
- 八位二进制数为什么表示范围是:-128~~+127?
- 计算机中char型数为什么表示的是-128————127
- 八位二进制数为什么表示范围是:-128~~+127?
- 反码符号-128有8位二进制表示的原码、反码和补码
- 8位二进制数能表示的最小整数为什么是-128,10000000为什么是-128的补码。
- 为什么0.1无法被二进制小数精确表示?
- 八位二进制数为什么表示范围是:-128~~+127?
- -128有8位二进制表示的原码、反码和补码
- 八位二进制数为什么表示范围是:-128~~+127?
- 为什么char能表示-128