计算机为什么使用补码来存储数据
说明:以下讨论,都是用8位来存储的数据类型:char类型,
为什么?为什么用补码呢?我反复思考着,后来在王爽的汇编语言里和网上找到了答案,有如下总结:
原码表示的数:
原码的数出现0,和-0的两个码!我们知道-0== 0;所以0000 0000,1000 0000两个码会表示同一个数!
8位数据可以表示-127~127的254个有符号数。但是理论上8位数据是可以表示255中不同信息的。
反码表示的数
:

同样反码也只能表示-127~127的254个有符号数。0出现重码。
补码表示的数
:

补码可以表示-128~127的255个有符号数;
补码的特性
不仅如此,补码还有很多特性,这些特性为符号数的运算提供了方便。(而且有些特新“原码”和“反码”是不具备的)
补码定义:正数的补码与原码相同;负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。
[X]补:表示X的补码
|X|:表示X的绝对值
当X < 0 时[X]补 = 2~8 - |X|;
当X >=0 时[X]补 = |X| =X;
1) [X+Y]补 = [X]补 +[Y]补
2) [X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补
3) [X*Y]补=[X]补*[Y]补 (乘数(被乘数)相乘的补码等于补码的相乘。)
4) 正数的补码取反加1后,为其对应的负数的补码;负数的补码取反加1后为其绝对值的补码。
即:X>=0:[ [-X]补 ]补 = |X| = X
X<0 [ [X]补]补 = |X| = -X
等等……
我尝试着证明了其中一个特性: [X+Y]补 = [X]补 +[Y]补
(1)设:X>=0,Y>=0;-àX+Y>=0
所以[X+Y]补=X+Y;[X]补=X;[Y]补=Y;
所以[X+Y]补 = [X]补 +[Y]补
(2)设:X<0,Y<0;àX+Y<0 且|X|+|Y| = |X+Y|
[X+Y]补 = 2^8-|X+Y|;[X]补=2^8-|X|;[Y]补=2^8-|Y|;
[X]补+[Y]补 = 2^8-(|X|+|Y|)+2^8;
因为只有8位表示而且还有一位是符号位所以(|X|>=0&&|X|<2^7)&& (|Y|>=0&&(|Y|<2^7)à|X|+|Y|<2^8)所以2^8-(|X|+|Y|)>0
所以2^8-(|X|+|Y|) +2^8将会溢出一位(因为只有8位存储数据),所以2^8-(|X|+|Y|)+2^8 =2^8-(|X|+|Y|) = 2^8-(|X+Y|) = [X+Y]补
(3)设X>=0,Y<0
[X]补+[Y]补 =|X| +2^8-|Y| = 2^8 +(|X|-|Y|)
3-1)再设|X|>|Y|à(|X|-|Y|>0且X+Y>0)由于只有8位来存储数据,会溢出一位,所以2^8+(|X|-|Y|) = |X|-|Y| = X+Y(因为X>=0 ,Y<0)
因为X+Y>0所以[X+Y]补 = X+Y=[X]补+[Y]补;
3-2)再设|X|<=|Y|à(|X|-|Y|<=0 且 X+Y<=0)所以[X+Y]补=2^8 - |X+Y| = 2^8+X+Y=2^8+|X|-|Y|=[X]补+[Y]补;
综上可得出: [X+Y]补 = [X]补 +[Y]补
自己证明的,也许有错误,如果有错,望指教!