正数原码与反码、补码一致;
负数反码是将其原码除符号位之外的各位求反,补码是将反码加1。
所以4楼的解释是有问题的。
-5的二进制的原码是 1000 0000 0000 0101
反码是 1111 1111 1111 1010
补码是 1111 1111 1111 1011
----------------------------------------------------------------------------------------------
以下转载,解释有符号的数范围为何是-(n+1)~n:
为什么要设立补码呢?
第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补
第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)
有人会问
10000000这个补码表示的哪个数的补码呢?
其实这是一个规定,这个数表示的是-128
所以n位补码能表示的范围是
-2^(n-1)到2^(n-1)-1
比n位原码能表示的数多一个