原码,反码,补码

首先需要指出,数字是以“补码”的形式存储在计算机中的。在分析这样做的原因之前,我们首先给出三者的定义。

  • 原码:我们将数字的二进制表示的最高位视为符号位,其中 0 表示正数,1 表示负数,其余位表示数字的值。
  • 反码:正数的反码与其原码相同,负数的反码是对其原码除符号位外的所有位取反。
  • 补码:正数的补码与其原码相同,负数的补码是在其反码的基础上加 1 。

我们知道负数的原码不能直接进行运算,因此便引入了反码,反码进行运算后的结果再化为原码就可以了。

原码零存在+0,-0两种表示方法。

+0:00000000

-0: 10000000

 这意味着数字零会带来两种不同的编码,因此会产生歧义。比如在进行条件判断时,计算机会因为我们没有区分正负零而编码错误。

反码与原码同样存在正负零歧义,为了解决这个问题,计算机进一步引入了补码。我们来看它们之间的转换关系

-0的原码:1000 0000

-0的反码:1111 1111

-0的补码:10000 0000

由于一个字节(byte)只有8个bit位,也就是二进制位,因此-0的补码的最高位溢出了,会被计算机舍弃,所以就是0000 0000,即不存在正负零了。

既然补码没有-0,那么1000 0000的补码是多少呢?

我们知道byte的取值范围是-128-127,实际上除了-128,其余的数字都有相应的反码和补码。回到上面的问题,1000 0000如果转换成原码是0000 0000,这显然是有矛盾的,因为该原码表示0,那么它的原码,反码,补码都应该是相同的。因此我们认为1000 0000是不存在原码的,我们可以看作带负数的无符号数(虽然这是矛盾的,便于自己理解就行)。即最高位先不看作符号数来计算。

事实上-1+-127在补码的结果就是-128

-1:    1000 0001 ->1111 1110(反码)  ->1111 1111(补码)

-127:1111 1111  ->1000 0000(反码) ->1000 0001(补码)

1111 1111+1000 0001=1000 0000

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值