1. 为什么要用补码?
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的。假设有原码A,B,记“(补)A”为求A的补码,则有: 1. (补)((补)A) == A 2. A+B == (补)((补)A + (补)B) 3. (补)(A-B) == (补)A + (补)(-B) 其中1、2称为补码的幂等性,该特性决定我们虽然运算使用补码,但是通过两次补码可以回到原码;3则体现了补码可以将加、减运算统一起来,简化了运算规则
2. 补码定义
正数: 原码=反码=补码
负数: 原码 反码=其原码除符号位之外的各位求反
3. 实例
正零和负零的原码表示分别为00000000和10000000,而它们的补码表示都是一样的00000000
原码:10000000 反码:11111111 补码:11111111+1 = (1)00000000 = 00000000 //符号位也要进位
10000000这个补码表示的哪个数的补码呢? 这是一个强制规定,这个数表示的是-128(-128是没有原码的,而零有两个原码即+0和-0) 所以n位补码能表示的范围是[-2^(n-1), 2^(n-1)-1],比n位原码能表示的数多一个
4. 几个特殊定义
n位补码能表示的范围:有符号数[-2^(n-1), 2^(n-1)-1];无符号数[0, 2^n-1]-128的补码是100000000的补码是000000005. 已知补码求原码
正数(首位是0):不变负数(首位是1):符号位不变,其他位取反,然后加一(相当于再取一遍补码)参考链接1 参考链接2