黑马程序员技术交流社区

标题: 负数的二进制表示问题 [打印本页]

作者: 403383221    时间: 2013-4-11 22:00
标题: 负数的二进制表示问题
本帖最后由 403383221 于 2013-4-11 23:29 编辑

“负数的2进制表现形式是对应正数二进制取反加1”这句话是规定还是有什么原理?1000-0000 0000-0000 0000-0000 0000-0010是-2吗?搞迷了
作者: 刘林虎    时间: 2013-4-11 22:21
1个字节它不管怎么样还是只能表示256个数,因为有符号所以我们就把它表示成范围:-128-127。它在计算机中是怎么储存的呢?可以这样理解,用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示27个数的绝对值,再考虑正负两种情况,27*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码。到这里很多人就会想,那负数是不是从10000001到11111111依次表示-1到-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为10000000的情况没有考虑在内。实际上,10000000在计算机中表示最小的负整数,就是这里的-128,而且实际上并不是从10000001到11111111依次表示-1到-127,而是刚好相反的,从10000001到11111111依次表示-127到-1。负整数在计算机中是以补码形式储存的,补码是怎么样表示的呢,这里还要引入另一个概念——反码,所谓反码就是把负数的原码(负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相同)各个位按位取反,是1就换成0,是0就换成1,如-1的原码是00000001,和1的原码相同,那么-1的反码就是11111110,而补码就是在反码的基础上加1,即-1的补码是11111110+1=11111111,因此我们可以算出-1在计算机中是按11111111储存的。总结一下,计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加1。
十进制 → 二进制  (怎么算?要是不知道看计算机基础的书去)
47   → 101111

有符号的整数    原码    反码    补码
  47      00101111  00101111  00101111(正数补码和原码、反码相同,不能从字面理解)
 -47      10101111  11010000  11010001(负数补码是在反码上加1)



现在知道了吧?
6的原码是00000110
6的反码是11111001
反码+1以后表示负数
11111010
这就是-6
作者: 张旺达    时间: 2013-4-11 22:29
在计算机中,负数以其正值的补码形式表达。

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
补码:反码加1称为补码。也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
所以简单说就是取反+1:
2的二进制为0000-0000 0000-0000 0000-0000 0000-0010,
取反为     1111-1111 1111-1111 1111-1111  1111-1101,
取反+1为  1111-1111 1111-1111 1111-1111 1111-1110=-2,






作者: 闫玉龙    时间: 2013-4-11 22:39
-2:其实就是2的二进制取反+1。  取反:就是将二进制的1变成0,0变成1。
2的二进制在内存中是:    0000-0000  0000-0000  0000-0000  0000-0010
取反得                           1111-1111  1111-1111  1111-1111  1111-1101

取反加1得:            
         1 1 1 1-1 1 1 1    1 1 1 1-1 1 1 1    1 1 1 1-1 1 1 1    1 1 1 1-1 1 0 1
      + 0 0 0 0-0 0 0 0    0 0 0 0-0 0 0 0    0 0 0 0-0 0 0 0    0 0 0 0-0 0 0 1
—---------------------------------------------------------------------------------------------------------------
         1 1 1 1-1 1 1 1    1 1 1 1-1 1 1 1    1 1 1 1-1 1 1 1    1 1 1 1-1 1 1 0

所以-2的二进制是1111-1111  1111-1111  1111-1111  1111-1110


作者: 403383221    时间: 2013-4-11 23:14
刘林虎 发表于 2013-4-11 22:21
1个字节它不管怎么样还是只能表示256个数,因为有符号所以我们就把它表示成范围:-128-127。它在计算机中是 ...

明白了,谢谢哈
作者: 郭强    时间: 2013-4-11 23:22
绝对值二进制取反加1就是补码。二进制正数的补码就是原码;二进制负数的补码就是绝对值二进制取反加1。+1=00000001-1=11111110+1=111111110-1=0+(-1)=00000000+11111111=111111112-1=2+(-1)=00000010+11111111=00000001
作者: 钟林杰    时间: 2013-4-11 23:30
这是计算机里面编码规定的。
计算机中表示一个带符号数的方法有原码表示法、补码表示法、反码表示法、移码表示法。在这几种编码中0代表正数,1代表负数。
原码正数不变只需在前面加上0,原码的负数加上1表示。例:x=1010 ,y=-1010   原码正数x=01010 原码负数 y=11010.
补码正数与原码一样。负数按位取反后加上1。例:x=-1010 取反后得x=-0101加上1后得x=-0110所以补码为x=10110.
反码正数与原码相同,负数直接按位取反即可。例:x=-1010反码为x=110101
移码等于它的二进制位加上2^n构成。例如:x=1010,y=-1010当n=4时。2^4=16,既10000.所以移码x=10000+1010=11010, y=10000+(-1010)=00110
作者: 403383221    时间: 2013-4-11 23:41
钟林杰 发表于 2013-4-11 23:30
这是计算机里面编码规定的。
计算机中表示一个带符号数的方法有原码表示法、补码表示法、反码表示法、移码 ...

恩恩,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2