List 3.5 详解原码、反码、补码

这篇具有很好参考价值的文章主要介绍了List 3.5 详解原码、反码、补码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 前言

本博客文章已收录至我的Java SE专栏,如需阅读其他有关博客笔记请转至该专栏下

传送门 -->Java SE_程序员雨空集


目录

 前言

原码

原码的示例

原码的弊端

反码

反码的示例

反码的弊端

补码

补码的示例

补码的小细节

总结


原码

原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负

利用原码对正数进行计算是不会有问题的。

十进制是逢十进一,不会出现10这个数字。

二进制是逢二进一,不会出现2这个数字。


原码的示例

比如十进制56转成二进制就是00111000。

00111000中,最左边的0就是代表这个数为正数,其余的0111000代表56,也就是下面这个样子。

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

其中,一个0或者一个1就代码1bit(中文翻译叫比特位)。

计算机里是通常是把8个bit分为一组,叫做一个byte(字节),而字节是计算机中最小的存储单元。

而一个字节最大值表示为01111111,转化成十进制就是+127,是正的127。

最左边的符号位取0,其余位为数据,因为是求最大,每位上全部取最大为1。

而一个字节最小值表示为11111111,转化成十进制就是-127,是负的127。

最左边的符号位取1,其余位为数据,因为是求最小,每位上全部取最小也为1 。


原码的弊端

又举个例子

现在有一个字节代表的数是-0,也就是0,如下图

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

如果我现在要对它进行+1操作,也就是下面这样

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

按理说0+1=(+1),但是根据上图,这样做的话就粗问题了,按照二进制的规则,这样操作的二进制转成十进制为-1,也就是下图才是我们想要的结果

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

如果在此实际值上再进行+1操作,又出现了下面的情况

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

为什么会出现这样的情况呢?

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

想要理解清楚,需要结合数轴去理解

如果我要用二进制表示0的基础上+1,但是因为符号位是1代表负数,实际是在0的位置上往负的方向前进的1单位,如下图所示

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

所以这就是原码的弊端:在原码的基础上,如果是负数计算,结果就出错,实际运算的结果,跟我们预期的结果是相反的。

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

如果我们结合上面的数轴,在进行负数计算的时候,如果把数轴的方向倒转一下,那不就得到了我们想要的结果了吗?因此,这就引出了反码的由来


反码

反码:为了解决原码不能计算负数的问题而出现的

计算规则:

  • 正数的反码不变。
  • 负数的反码在原码的基础上,符号位不变。数值取反,0变1,1变0。

为什么正数的反码不变?

  • 因为正数之间的计算是没有任何问题,只有我们上面举到的例子中有负数的计算才会有反码的出现

反码的示例

又又举个栗子

十进制-56的二进制原码是10111000。根据规则,符号位不变。数值取反,0变1,1变0。它的反码为11000111

验证反码能不能解决原码负数计算的问题,我们可以验证一下

就看看-56+1的值是不是为-55的这个情况?

  • -56的原码是10111000,而-56的反码就是11000111。
  • 进行-56+1的操作就是在-56的反码11000111从最右边的数字进1位根据二进制逢二进一变为11001000
  • 而55的原码是0011011,所以-55的原码就是1011011,所以-55的反码就是1100100,结果成立!

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

这么一来,你就懂了吧?如果还没明白,把上面的步骤多看几遍,你就懂了


反码的弊端

又又又举个例子,我现在

现在又一个十进制数字-2,其原码是1000 0010,其反码为1111 1101

  • 如果对-2进行+1操作之后,其原码变为1000 0001,反码变为1111 1110,结果为-2+1=-1,没问题
  • 如果对-2进行+2操作,也就是两次+1操作,原码会变成1000 0000 ,反码变为1111 1111,结果为-2+2=0 也没问题
  • 如果对-2进行+3进行操作,也就是三次+1错做,原码会变成0000 0000,反码变成0000 0000,结果为-2+3=0,到这里就不对起来了?

为什么会出现这样的情况呢?

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

就是因为二进制对于0的表达有两种方式,如下图表格所示

十进制数

原码

反码

+0

0000 0000

0000 0000

-0

1000 0000

1111 1111

-1

1000 0001

1111 1110

-2

1000 0010

1111 1101

怎么解决呢?这就引出了补码的由来

当初的哪些计算机大佬是那么想的:既然反码计算到0的时候会因为有2个0的表达方式而造成计算误差,那我把反码中的两个0的表达方式屏蔽一个不就好了嘛。所以就有了补码的出现

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

十进制数

原码

反码

补码

+0

0000 0000

0000 0000

0000 0000

-0

1000 0000

1111 1111

0000 0000

-1

1000 0001

1111 1110

1111 1111

-2

1000 0010

1111 1101

1111 1110

这样就可以把0的两种表现形式给屏蔽掉了,但是这里的补码是为了有负数、有反码的计算。

如果全部是正数的计算就用原码计算即可


补码

补码:为了解决反码不能计算负数超过0的问题而出现的

补码的示例

先把上面的表拿下来

十进制数

原码

反码

补码

+0

0000 0000

0000 0000

0000 0000

-0

1000 0000

1111 1111

0000 0000

-1

1000 0001

1111 1110

1111 1111

-2

1000 0010

1111 1101

1111 1110

-3

1000 0011

1111 1100

1111 1101

-4

1000 0100

1111 1011

1111 1100

举例一个跨0的情况,进行-4+5的操作

  • -4的补码是1111 1100
  • 5是一个正数。正数的原码、反码、补码的值都是一样的,所以补码为0000 0101
  • 把两者补码进行相加操作,得到补码0000 0001,表示十进制的数就是1,成功!

List 3.5 详解原码、反码、补码,Java SE,java,c++,学习,笔记,python

这么一来,你就懂了吧?如果还没明白,把上面的步骤多看几遍,你就懂了


补码的小细节

因为补码是在反码的基础上+1得到的,所以-127的补码就是1000 0001,所以就会空出一位,因为+0和-0的补码是相同的,就会节省出一个补码跑到最下面,如下图所示

十进制数

原码

反码

补码

+0

0000 0000

0000 0000

0000 0000

-0

1000 0000

1111 1111

0000 0000

-1

1000 0001

1111 1110

1111 1111

-2

1000 0010

1111 1101

1111 1110

-3

1000 0011

1111 1100

1111 1101

-4

1000 0100

1111 1011

1111 1100

......

......

......

......

-126

1111 1110

1000 0001

1000 0010

-127

1111 1111

1000 0000

1000 0001

-128

1000 0000

因为补码的这个特性,-128是特殊规定的,因此没有原码和反码。但是这也不影响,因为计算机中数字的存储和运算都是以补码为基础进行的


总结

原码是用来表示十进制数据的一种二进制形式,最左边的一位是符号位,0表示正数,1表示负数。但是,原码不能直接用于负数计算,如果用原码进行负数计算,结果会出错,实际运算的方向与正确运算的方向相反。


反码是为了解决原码不能计算负数的问题而出现的。对于正数,反码和原码一样;对于负数,反码是在原码的基础上将符号位不变,数值位全部取反(即0变1,1变0)。然而,反码也存在一个问题,那就是如果负数的计算结果跨过0,那么结果会比实际结果多1。


补码则是为了解决反码不能计算负数超过0的问题而出现的。对于正数,补码和原码、反码一样;对于负数,补码是在反码的基础上加1。这样,负数就可以正确地用补码表示了。此外,补码还可以多记录一个特殊的值-128,这在用一个字节表示数据的情况下是特别重要的。文章来源地址https://www.toymoban.com/news/detail-718175.html

到了这里,关于List 3.5 详解原码、反码、补码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是原码、反码和补码

    前言 一个数在计算机中的表示形式是二进制的话,这个数其实就叫机器数。 机器数通常是带有符号的(指有正数和负数之分),计算机用最高位存放符号,这个 bit 一般叫做符号位。 正数的符号位为 0, 负数的符号位为 1。比如,十进制中的数 +7 ,计算机字长为8位,转换成

    2023年04月09日
    浏览(37)
  • 原码、补码、反码的关系及应用场景

    是三种表示有符号整数的方法,它们之间存在一定的关系。 原码 是最基本的表示方法,即将一个数的符号位和数值位分开表示,符号位用0表示正数,用1表示负数。例如,+7的原码为00000111,-7的原码为10000111。 反码 是在原码的基础上,将负数的数值位按位取反得到的表示方

    2024年02月06日
    浏览(47)
  • C++知识精讲13 | 原码、反码和补码

    ------------------------------------------------------------------------------------------------------------------------- 观看视频ing......  12岁的少年编程者告诉你编程如此简单  ------------------------------------------------------------------------------------------------------------------------- ---------------------------------------

    2024年02月16日
    浏览(37)
  • 【007】C++数据类型之原码、补码、反码

    💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。 👉 🎖️ CSDN实力新星,社区专家博主 👉 🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、

    2024年02月05日
    浏览(32)
  • 补码的反码加1为什么是原码?

    搞了半个小时,终于弄懂了。 16 8 4 2 1 原码 1 0 0 1 1 反码 0 1 1 0 0 补码 0 1 1 0 1 学到这里了,我们肯定知道,原码+补码 = 0,在这里也就是 = 19 + 13 = 32,溢出来的一位正好舍去了; 所以说,对啊,只要保证原码+补码 = 32(以此类推)不就好了吗! 所以,补码是 通过原码 这样得

    2024年02月10日
    浏览(33)
  • 位运算(按位与、按位或、异或、取反)以及原码、反码、补码

    目录 位运算 按位与运算符 [ ] 按位或运算符 [ | ] 异或运算符 [ ^ ] 取反运算符 [ ~ ] 移位操作 一些面试常考的位操作运算 获取二进制中最右边的1 计算机原码、反码、补码 机器数 “三码”之间的转换 计算机中为啥要用补码呢? 真数 原码 反码 补码 有了原码为什么要使用反码

    2024年02月02日
    浏览(50)
  • 【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

    欢迎大家来到c语言知识小课堂,今天的知识点是操作符和进制 同样都是数字1111,不同进制下数字的大小不同,第二行代表的是其各位数字十进制下的大小,将各位数字的十进制大小相加即1111在这个进制下转化为十进制的大小,从图中我们可以看出来 进制的定义:从右往左

    2024年02月22日
    浏览(52)
  • 爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)

    🚀 作者:阿辉不一般 🚀 你说呢: 生活本来沉闷,但跑起来就有风 🚀 专栏:爱上C语言 🚀 作图工具:draw.io ( 免费开源的作图网站) 如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主,如有不足还请指点,博主及时改正,感谢大家支持!!! 大家好啊😉!今

    2024年02月05日
    浏览(55)
  • 关于二进制的原码、补码和反码,以及表示范围、常见位运算符和进制转换的理解与简述

    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17963363 出自【进步*于辰的博客】 参考笔记一,P3.13、P5.1;笔记三,P43.1/3、P44.1。 注:我暂且没有整理关于二进制、原码、补码和反码等概念的理论,本文中的阐述都基于

    2024年02月02日
    浏览(46)
  • ⚡【C语言趣味教程】(2) 整数类型:数据类型的概念 | 原码反码与补码 | 有符号型和无符类型 | 研究 signed char 与 unsigned char 的取值范围

      🔗 《C语言趣味教程》👈  猛戳订阅!!! 在讲解数据类型前,我们不得不先讲解一些必备的知识点,比如如何定义一个变量,数据类型的基本概念。并介绍 ASCII 码,为 char 类型的讲解做必要的铺垫。然后讲解原码反码和补码,讲解 IEEE754标准时需要这部分的知识作为基

    2024年02月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包