原码、反码、补码

这样给小白讲原码、反码、补码,帮她彻底解决困扰了三天的问题 - bigsai - 博客园前言 补码是给机器看的,原码是给人看的,反码是二者的桥梁,原码反码补码虽然是简单问题,但确实很多人很长时间没有搞明白和深入思考,这篇把自己学习和理解过程记录下来,刚好一个学妹问到这个问题。本篇只讲原码https://www.cnblogs.com/bigsai/p/14930883.html

1.原文总结:

原码表示直观但是做运算时仅仅是绝对值进行了运算遇到负数就会出问题。

反码运算正数范围内玩没问题,负数范围内玩也没问题,但是当你从负数迈到正数的时候会经过两个0(-0,+0)两个零重复表示了。

补码运算都没问题。

上面文章中有一个问题更正一下。

如果用反码进行运算负数和负数相加总是会比正确结果小1。

例: -1的原码 1000 0001  反码 1111 1110 

-1 + -1 = 1111 1110  + 1111 1110 = 1111 1100 

1111 1100是反码 变成原码就是 1000 0011 是 -3 而 -1 + -1应该是-2 

原因是有两个0 导致的所以后面就有人想出了给负数的反码都加1变成补码去运算

2.补码没有-0

原码 -0 表示为 1000 0000 它的补码是 0000 0000

源码 +0 表示为 0000 0000 它的补码是 0000 0000

所以补码没有-0,那补码的1000 0000 则表示为 -128 这也就是为啥只有 -128 到 127

计算机中都是补码进行运算和存储的

原码没有-128的写法。

3.为什么会想到反码这个东西?

原码的运算规律就是绝对值相加如果用原码来计算 -1 + 1

即 1000 0001 + 0000 0001 = 1000 0010 为 -2就是符号位没有变绝对值加1这个运算规律明显不符合负数的运算规律,反码虽然有+0和-0的问题,但是它的运算规律确实是正确的,为什么反码的运算规律是正确的

这其实是一个障眼法:

举一个经典的例子,我们日常生活中的12个刻度的时钟,它表示0-12小时。假设它现在处于2的位置,如果你要让它减少4个小时,到10的位置,你会怎么做?把时钟顺时钟按照3,4,5的方向转8个小时?还是按照1,12,11的方向逆时针转动转4个小时?这2者的结果都是一样的,让时钟到了10的位置。我们来看一下,一个是拨了8小时,一个是拨了4小时,8+4=12,12-8=4。一个时钟一圈12个小时,也就是说最大的表示上限是12。往前8小时和往后12-8=4小时效果是一样的。而这个12就是所谓的【模】。在模的范围内,+某个数x与+模-|x|的效果是一样的

那我们在计算机中数据类型都是固定长度的,所以有模。

举个例子假如数据类型的长度是1byte 那它的模是 1111 1111 

如果是 - 1 怎么表示,我们用公式 模 - |x| = 1111 1111 - 0000 0001 = 1111 1110 正好是 -1的反码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值