二进制有符号数补码
- 符号位定义
- 可表示的数值范围
- 补码求原码
- 有符号二进制补码求十进制
二进制补码标准定义中,符号位只有一位--最高位的那一位。特殊的,当补码位数扩展时高位会填充原符号位的值。如-3用4位补码表示为1101,扩展到8位时-3的补码表示为11111101,虽然符号位进行了扩展,但是按补码的标准定义,只有最高位为符号位,其余为数值位,或者说是符号扩展的冗余位。
对于N位有符号二进制数,原码可表示的范围为-2⁽ⁿ⁻¹⁾-1~2⁽ⁿ⁻¹⁾-1,补码可表示的范围为-2⁽ⁿ⁻¹⁾~2⁽ⁿ⁻¹⁾-1。例如,对于4位有符号二进制数,原码可以表示的范围为-7~7,补码可以表示的范围为-8~7。对于4位有符号二进制数,最大的正数为0111(补码),即7;最小的负数为1000(补码),即-8;1111(补码)为-1。
由于同等位宽的有符号二进制数原码和补码表示的数值范围有差异,由补码求原码时可能存在原码表示范围不能表示补码对应的值,因此值得注意的是,由负数补码转换为原码时可以先对符号位进行扩展(此操作不影响数值大小),一位即可,然后再求原码。
对于一个有符号数,怎样根据补码求十进制数?
(1)先根据补码求原码,求出原码后可知十进制数。例如有符号数1000(补码)的原码为11000,所以十进制为-8。有符号数0110(补码)的原码为0110,所以十进制值为6。
(2)直接由补码求十进制。举例说明,有符号数1110(补码)=-1*2³+1*2²+1*2¹+0*2⁰=-8+4+2+0=-2;有符号数0110(补码)=0*2³+1*2²+1*2¹+0*2⁰=0+4+2+0=6;有符号数11101(补码)=-1*2⁴+1*2³+1*2²+0*2¹+1*2⁰=-16+8+4+0+1=-3。
二进制有符号数加减法
- 运算法则
- 判断有无溢出
两个二进制有符号数进行运算时先要通过扩展符号位(不影响数值大小)把位宽对齐,例如:1111(-1的补码)+10(-2的补码),位宽不一致,因此先将-2的补码扩展为4位补码,即1110(-2的补码),1111与1110相加为11101,符号位进位舍去(没有溢出)为1101(-3的补码)。计算过程中虽然符号位有进位,但是并未溢出,后续分析。
如何判断有无溢出?核心就是符号位和数值位最高位的进位情况是否一致,一致则认为无溢出,否则为溢出。在上述计算中数值位最高位和符号位进位都为1,所以无溢出,符号位进位舍弃。再例如1011(-5补码)+1100(-4补码)的过程中,数值位最高位的进位为0,符号位进位为1,二者不同,因此可以判断为溢出,计算结果的符号位进位不能舍去,结果为10111(-9的补码)。
3位有符号二进制数110(-2的补码)+010(2的补码)=1000,计算过程中符号位和数值位最高位都产生了进位1,因此无溢出,符号位进位直接舍弃,所以计算结果为000。
总的来说,两个二进制有符号数进行运算时,可以先计算,根据计算过程判断有无溢出,有溢出则符号位进位不能省,无溢出则可以直接丢弃符号位进位。
如何快速写出一个有符号负数的补码呢?
举例,4位有符号数2的补码为0010,-2的补码呢?4位有符号数最小的负数是-8,因此-2的补码为1110;-3的补码1101,-4的补码为1100。
再举例,3位有符号数最小的负数是-4,那么-1的补码为111,-2的补码为110,-3的补码为101。
如何根据补码快速求出十进制数?
4位有符号数0111十进制数为7,对于负数呢?4位有符号数最小的负数是-8,1011(补码)中数值位为3,因此十进制数为-5;1111(补码)中数值位为111是7,所以十进制是-1。

2万+

被折叠的 条评论
为什么被折叠?



