数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制;
在八位二进制下,-128不能用原码或反码表示,反码只能表示0到127,-0到-127;
用补码表示为:10000000
补码的计算有两种方法:
1.一个数取代数的负号运算,相当于先取反再加1,10000000先看成是负数,我们要知道它的绝对值是多少,就取反加1,可结果还是10000000
这时不能看成负数了,最高位是数值位,因此是128,所以原来是-128。
2.127是01111111,01111111+10000000=11111111,127+x=-1,=>x=-128。
在八位整数里原码的取值范围为-127到+127,反码也是;在八位二进制中就把-0当作最小数-128用,也就是10000000
-0的原码:10000000
-0的反码:11111111
-128的补码:10000000
补码的设计目的是:
使符号位能与有效值部分一起参加运算,从而简化运算规则;
使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计 。
负数的补码就把他正数的原码取反再加1就可以了,正数的原码反码补码都是一样的。
-128,有八位的补码,却没有八位的原码和反码。
因为,原码和反码的定义,都是有缺陷的:
一个数字零,它们却都定义了两个编码 +0-0!
所以,八位的原码反码,只能表示-127 ~ +127。
所以,它们都无法表示-128。
因此,用“取反加一”求-0 或-128 的补码,都是行不通的。
同样,用“取反加一”求补码 1000 0000 对应的原码,也是不灵的。
-------------------------
求补码的正规做法,是使用定义式:
当 X >= 0, [ X ]补 = X; 零和正数不用变换。
当 X < 0, [ X ]补 = X + 2^n。 n 是补码的位数。
这个定义式,是通用的。你可以在书上找到的。
那么,[-128]补 = -128 + 2^8 = 1000 0000 (二进制)。
也就是说:八位的补码 1000 0000,代表的数值是-128。