1、正数的补码表示:
正数的补码 = 原码
= {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反}
以十进制整数+97和-97为例:
+97补码 = 0110_0001b
-97原码= 1110_0001b
-97补码= 1001_1111b
补码中第一位是符号位,只有剩下的七位是数值位,即
数值位全为 1 时,最大值为 -27 - 1 ,即 -127;如果再加 1 就会发生溢出变成 1000 0000。
在补码中只有一个 0 ,即 0000 0000,+0;而 -0 ,1000 0000 在补码中规定用来表示 -128,也就是补码中的一种 数码结合 形式,符号位也表示数值位。
上面只是说规定 1000 0000 表示 -128,那么, -128 的补码可以通过计算出来吗?
答案是可以的,我们可以通过无符号数来计算出补码(无符号数的补码原码和反码都是一样的)。
有符号数可以通过模运算来获得对应的无符号数(n 位二进制数的模为 2n,即 8 位二进制数的模为 256):
当 0<= x <= 27 时,x无 = x
当 -27 <= x < 0 时,x无 = x + 28
正数的补码就是其本身
如+9的补码是00001001。
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值。
正整数的补码是其二进制表示,与原码相同 。
例:+9的补码是00001001。
求负整数的补码,将其对应正数二进制表示所有位(包括符号位)取反(0变1,1变0,符号位为1不变)后加1 。