补码,是一种用二进制表示有号数的方法,也是一种将数字的正负号变号的方式。
1、在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
正数的补码,与原码相同。
负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。
1000 0000 的反码是 0111 1111,十进制为 127,补码是反码+1,即128 。
原码和补码相加为 0,所以 1000 0000 是 128 的补码,即 -128 。
为什么补码到-128? 因为原码中0 =[0000 0000]原=[1000 0000]原,用了两个字节表示0。反码中1-1=[1111 1111]反 = [1000 0000]原 = -0,因此,0=[0000 0000]反=[1111 1111]反,也是用两个字节表示。而补码中1-1 = 0 = [0000 0000]补 = [0000 0000]原。所以,[1111 1111]补=-127,而原本[1111 1111]反的补码应该为-128,因此补码多一位-128.
补码为什么可以表示-128
呵呵,你应该问:原码反码为什么不能表示-128。
八位的二进制,共有 2^8 = 256 个代码,应该表示 256 个不同的数值。
八位的补码,表示范围,是:-128 ~ +127。这是 256 个数值,很正常。
八位的原码反码,范围却是:-127 ~ +127。只有 255 个数值!
原因,也很简单。 毛病就在于:“零”的定义。
天下,本来只有一个零。
零既不是正数,也不是负数。 这些,小学生都明白的。
但是,计算机大佬,竟然给零加上了“符号位”。
异想天开的,给一个零,弄出来两个编码(+0、-0)!
他们,这就是想要上天哪!
如果他们有小学毕业的水平,也不会这么胡编乱造。
在原码反码中,零,多占用了一个编码,-128 就不存在了。
因此,原码反码这两种乱码,在计算机中,根本就无法使用。
所以,在计算机系统中,数值,一律采用补码表示和存储。
码长八位,原码反码,都不能表示-128。
但是,补码却能表示-128,为什么?
因为,这些事,都是人为定义的。
定义原码反码的人,都是定义了两个零。
而定义补码的人,只定义了一个零。
所以,补码,就比原码反码,多代表了一个数,即-128。