16位-32768的补码和原码是什么【补码和原码的转换】
说到负数求补码,最先想到的可能是以下步骤:
1、确定负数的原码
2、求反码(除符号位不变,其他位取反)
3、反码加1得到补码。
例:-9的补码表示
1、确定原码是1000 1001
2、求反码1111 0110
3、反码加1得到1111 0111
下面验证一下,
对于原码1000 1001,十进制为1* 2^3 + 0* 2 ^2 + 0* 2 ^1 +1* 2 ^0=8+1=9,由于符号位是1代表是负数,所以是-9。这是原码的计算(符号位不参与运算)。
对于补码1111 0111,转换为十进制位-1* 2 ^7 + 1* 2 ^6 + 1* 2 ^5 + 1* 2 ^4 + 0* 2 ^3 + 1* 2 ^2 + 1* 2 ^1 + 1*2 ^0 = -128+64+32+16+4+2+1=-9。这是补码的计算(符号位参与运算)。
以上是针对8bit的表示,并且-9在8bit有符号的表示范围内(-128~127)。符号位在原码计算中不参与运算,在补码运算中参与运算。
上面的计算基于-9在8bit的表示范围内-128 ~ 127(-2^8~2 ^8-1),这里的范围指的是补码的表示范围,这个很重要。前面说到,用原码表示时符号位不参与运算,原码最大值为0111 1111=127,原码的最小值为1111 1111也是127,因为符号位为1所以是-127,也就是说原码的表示范围是-127 ~ 127。原码中无法表示-128。
那么补码能否表示-128呢?原码的最小值是-127,现在求一下它的补码,根据上面的三步可以知道原码是1111 1111,反码是1000 0000,补码为反码加1,即1000 0001。十进制-127-1=-128,对应补码1000 0001-1=1000 0000,所以补码可以表示-128,所以8bit表示的范围-128 ~ 128指的是补码的表示范围。-128是8位补码的最小值。
总结:
1、原码的计算符号位不参与运算
2、补码的计算符号位参与运算
3、8位二进制补码可以表示的数值范围为 -128 到 +127,其中:最小值为 -128(对应二进制 1000 0000),最大值为127(对应二进制 0111 1111)。
回到题目16位-32768的补码和原码是什么,16位的补码最小值为-2 ^(16-1)=-32768(对应二进制1000 0000 0000 0000),同理,原码中无法表示-32768,非要表示至少需要有符号数17位才行。
扩展
对于负数 -x,其补码等于 (2^16 - x) 的二进制形式。 16是有符号数x的位宽。
带入两个例子,第一个便是题目中的对于16位-32768的补码,等于2 ^16-32768=65536-32768=32768的二进制形式。在计算器中输入32768得到
正好与之前的对应。这里的二进制形式应该是无符号数的二进制形式。 前面说到如果是有符号的话,16bit的最大值是32767,无法表示到32768。
eg:-24446的补码(16bit)是多少?带入公式,补码等于2^16- 24446=41090的二进制形式。
使用前面的三步骤验证一下,-24446的原码是1101 1111 0111 1110,反码是1010 0000 1000 0001,补码为反码加1即1010 0000 1000 0010与计算器得出的结果是一致的。
在计算机中一般用补码表示数,1010 0000 1000 0010是补码,对于有符号数则为-24446,对于无符号数为41090。