-128,如果是16bit的话
原码:第一位是符号位,余下15位代表数值大小。因此为,1000
0000
1000
0000
补码:128为0x0080,负数为取反+1(two's
complement)是0xff80即1111
1111
10000
0000
反码:正数时与原码相同,负数时除符号位都是原码取反,即ff7f,1111
1111
01111
1111
补码是在计算机中,负数的存放形式。
补码有自己的规定和定义。
补码就是补码,和原码反码,没有任何关系。
原码反码,在计算机中,都不存在。
不存在的东西,不能作为任何依据。
因为用原码无法表示负数啊
两次米粉,
推断-128的原码和补码(用补码= 反码+1)
1.关于原码1000 0000,表示的是-0,还是-128呢?(答案是-128而不是-0)
1.先看看原码的概念吧:正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值
2.0是负数吗?0既不是正数也不是负数,那么它的符号位到底是0还是1呢?(0的符号位为0,不能为1)
3.看看负数补码的公式:负数的补码=10000 0000(模)-数的绝对值
比如:-1 1111 1111 =10000 0000-0000 0001
-2 1111 1110 =10000 0000-0000 0010
现在假设-0为负数,那么
-0的补码应该是10000 0000 - 0(这个0,姑且教0的绝对值吧)=0000 0000
反码:1111 1111(0000 0000 -1=0000 0000 +1111 1111=1111 1111)
原码:1000 0000
现在来推-128
-128的补码:10000 0000 - 1000 0000(+128没有符号位)=1000 0000
反码:1111 1111(1000 0000 -1=1000 0000+1111 1111=1111 1111)(补码-1)
原码:1000 0000(反码取反)
从上面看来,一个原码对应了2个补码
但是仔细分析:原码的概念,负数的符号位为1,但是0不是负数,所以不能用此公式
0也不是正数,但是可以把0定义为原码、反码和补码都一样(即0000 0000)
而且据说可以推断出0的补码只有一个(有兴趣的 可以去推一下,呵呵)
现在原码1000 0000就唯一表示-128了,而不会表示出-0,因为-0不能用这个公式计算
现在,补码1000 0000的原码是1000 0000(已证明),那么原码1000 0000的补码是1000 0000吗?
原码 1000 0000 (-128,进位被舍去)
反码 1111 1111
补码 1000 0000(1111 1111(反码) + 1=1000 0000,这里实际上真正相加的是1111 1111后面的7位,
第1位是符号位始终不会变,所以,当进到第8位的时候,就表示溢出了,会被舍弃)
2.综上所述:1.-128的补码和原码一样都是1000 0000,
2.0的原码、反码和补码都一样(即0000 0000)
3.如果把-0当做负数,1000 0000就会有歧义(事实上0的补码只有一个0000 0000)