计算机为什么使用补码来存储数据

计算机为什么使用补码来存储数据

说明:以下讨论,都是用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]补

自己证明的,也许有错误,如果有错,望指教!


  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值