计算机计算补码时按位取反要不要算上符号位
不相信的话可以给你举个例子证明一下:
不妨取一个4-bit register,规定最高位为符号位,对于-1原码表示为1001;
对于补码,按位取反,末位+1
①假设符号位参与取反,那么补码为0111(按位取反得0110,末位+1得0111)。
此时符号位不是1,而是0,代表正数,显然错误。
其实对于补码,最高位符号位对应的权值是-8,所以0111真正代表数字为
-8*0 + 4*1 + 2*1 + 1*1 = +7
②假设符号位不参与取反,那么符号位不参与运算,补码为1111(按位取反得1110,末位+1得1111)。
结果为 -8*1 + 4*1 + 2*1 + 1*1 = -1
对于原码,最高位权值是-1(所以常常理解为就是一个负号),但是对于补码最高位权值是-2^n(不仅仅是一个负号)
2.对于补码表示的数字求相反数(相反数仍以补码形式表示),符号位是参与的。
举个例子:2-bit Register
-1补码表示为 11
求-1的相反数:每位都取反,末位+1得到-1相反数为01,即+1
如有错误,欢迎指出。
HITWH ---LEVI
在计算机中,并没有 " 计算补码 " 时按位取反... 这种事。
" 计算补码 " 时按位取反...,
--这是由“人工操作”的,和计算机毫无关系。
因为:
计算机中的有符号数,都是用补码存放的。
计算机中,只有补码,并无原码反码。
计算机对补码,进行加减运算时,是把全部的位,都当做数据,根本就不考虑什么符号位。
符号位,原码反码,都是骗人的,在计算机里面,根本就没有这些东西。
补码
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
当 X < 0,其补码定义式如下:
[ X ]补 = 2^n -| X |, n 是补码的位数。
如,求-5 的八位补码。
[-5]补 = 2^8 -|-5 |
= 256 -5
= 251
= 1111 1011 (二进制)
由定义式,你也可以看出:
求补码时,是用“X 的绝对值”来计算的。
负数的绝对值,当然就是个“正数”。
即:求负数的补码,要用其正数来计算。
所以,你也可以如下计算:
+5 = 0000 0101,这就是 +5 的补码。
减一:0000 0100。
取反:1111 1011。这就是-5 的补码。
求补码,根本就不用原码反码符号位。
你只要按照上述方法,简单计算一下,就完了。