原码,反码和补码

计算机由0,1组成的数据要如何表示负数有如下三种方式:

  • 原码:将整数的最高位设为符号位(为1则为负,为0则为正),剩下的位表示整数的绝对值,其取值范围为-(2^k-1)-1 ~ +(2^k-1)-1
  • 反码:将整数的最高位设为符号位(为1则为负,为0则为正),且当表示负数时,将除符号位的所有位数进行反转(即0变为1,1变为0),其取值范围为-(2^k-1)-1 ~ +(2^k-1)-1
  • 补码:将整数的最高位设为符号位(为1则为负,为0则为正),且当表示负数时,将正数减1,然后反转每一位,其取值范围为-(2^k-1) ~ +(2^k-1)-1

个人思考:原码有符号位来表示正负足矣了,为什么反码和补码又要反转又要减1呢?以下《计算机体系结构精髓》里的描述。

① 原码,反码和补码每种都有有趣的特性。例如,原码可以创建一个负的零值,即使这个概念不能对应一个有效的数学概念。反码也提供了两个零值:所有位全0和它的补码(所有位全1)。最后,补码正值比负值多了一个(为了容纳零)。

三种表示法至少都被一台计算机使用过。但在硬件架构中补码方案是最常用的,原因有二:

  1. 补码使得构建低成本,高速度的硬件执行算术运算成为可能
  2. 其次,二进制补码算法的硬件也可以处理无符号的算术。
二进制串无符号位权解释原码解释反码解释补码解释
00000000
00011111
00102222
00113333
01004444
01015555
01106666
01117777
10008-0-7-8
10019-1-6-7
101010-2-5-6
101111-3-4-5
110012-4-3-4
110113-5-2-3
111014-6-1-2
111115-7-0-1

如上图所述,补码的优势如下:

  1. 无符号和补码的优点在除非溢出,否则相同的硬件操作对于两种表示都是有效的。例如,1001加1会产生1010,在无符号中,1加9等于10;在补码中,给-7加一就产生-6。所以计算机可以使用单个硬件电路来提供无符号或补码整数运算;运行在计算机上的软件可以为每个整数选择一个解释
  2. 补码相对反码和原码来说,同样的位数下,负数可以多一种解释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值