转载自:https://blog.csdn.net/zj15527620802/article/details/80362535

转载自:http://www.01happy.com/computer-true-code-complement-code/

感谢博主flysening、 陈杰斌的详细讲解!

一、概念介绍

首先提几个概念: 原码,反码,补码 

    原码是什么?

      原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码

      举例说明:

      int类型的 3 的原码是 11B(B表示二进制位), 在32位机器上占四个字节,那么高位补零就得:

      00000000 00000000 00000000 00000011

      int类型的 -3 的绝对值的二进制位就是上面的 11B 展开后高位补零就得:

      10000000 00000000 00000000 00000011      

      但是原码有几个缺点,零分两种 +0 和 -0 。很奇怪是吧!还有,在进行不同符号的加法运算或者同符号的减法运算的时候,不能直接判断出结果的正负。你需要将两个值的绝对值进行比较,然后进行加减操作 ,最后符号位由绝对值大的决定。于是反码就产生了。

    

    反码是什么 ?

      正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反

      举例说明:

      int类型的 3 的反码是

      00000000 00000000 00000000 00000011

      和原码一样没什么可说的

      int类型的 -3 的反码是

      11111111 11111111 11111111 11111100

      除开符号位 所有位 取反

      解决了加减运算的问题,但还是有正负零之分,然后就到补码了

    

    补码是什么?

      正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.

      还是举例说明:

      int类型的 3 的补码是:

      00000000 00000000 00000000 00000011

      int类型的 -3 的补码是

      11111111 11111111 1111111 11111101

      就是其反码加1

最后总结一下:

    正数的反码和补码都与原码相同。

    负数的反码为对该数的原码除符号位外各位取反。

    负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1  

各自的优缺点:

    原码最好理解了,但是加减法不够方便,还有两个零。。

    反码稍微困难一些,解决了加减法的问题,但还是有有个零

    补码理解困难,其他就没什么缺点了

喔日,说到这里,估计都晕了,举个栗子把。

5的原码是 00000000000000000000000000000101(四个字节,32位(byte))

5的原码和反码,补码都一样。

-5的原码是 绝对值转换成二进制位然后在高位补1就是这个负数的原码 ,10000000000000000000000000000101

-5的反码就是原码符合外取反得到反码11111111111111111111111111111010

-5的补码就是反码加一得到补码11111111111111111111111111111011

最后补充一句,负数一般用补码来计算。

二、计算机中的使用

在计算机中,正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。
负数用补码表示,如单字节-5,在计算机中表示为1111 1011。

计算机中数字都采用二进制来表示,正数容易理解,那么负数怎么表示呢?这里涉及到原码,补码和反码的知识,咋一看可能毫无头绪,但是只要记住计算机中有符号数都是用补码形式表示的这句话,后面理解起来就不难了。

先来理解下8位二进制数表示原理。从而可以延伸到32位,64位以及任意其他位数。

8位二进制正数表示范围

0000 0000 ~ 1111 1111
(0 ~ 255)

这个不难理解,那么如何表示负数呢?设计计算机的人就想,把最高位作为符号位,0表示正数,1表示负数。这样,8位二进制数表示范围就发生了变化:

负数:1 111 1111 ~ 1 000 0000 (-127 ~  -0)
正数:0 000 0000 ~ 0 111 1111(0 ~ 127)

但是如果在计算机中这样表示负数,那么相加减就很不方便。试想 -1 + 1 = 0 ,换成二进制就是:

  1 000 0001
+ 0 000 0001
-------------1 000 0010

计算机计算出来结果就是1 000 0010,这个结果等于-2,不是等于0,如果要保证结果正确,就需要修改计算机做加法的方式,非常不方便。于是设计计算机的人员就想到一个好方法,采用补码形式来表示有符号数。简单的说-1不是用1 000 0001来表示,而是用补码1 111 1111来表示,我们再来看下采用补码形式的 -1 + 1 的结果

  1 111 1111
+ 0 000 0001
----------------10 000 0000

因为是8位二进制数,所以舍弃最高位1,看下结果,非常完美,就是0

其实在上面的例子中,1 000 0001就是-1的原码,而1 111 1111就是-1的补码。这下原码和补码的定义就都有了。

那么补码怎么计算出来的呢?

1、正数:原码和补码一致
2、负数:原码取反,然后加1

例如求-1的补码:-1原码是1 000 0001,符号位保持不变,取反就是 1 111 1110 ,然后加1,就得到补码1 111 1111了。

大家会发现,-1的补码还可以这么求:1取反(包括符号位),然后加1,其实也能得到-1的补码。在程序中,求一个数的相反数,如果看到这样的写法 ~num + 1,其实就是这个原理了。我个人还是更喜欢直接用 -1 * num,这样更通俗易懂。

正数负数的原码,反码,补码相关推荐

  1. 正负数的原码反码补码

    对于有符号的而言: 1) 二进制的最高位是符号位: 0 表示正数,1 表示负数 2) 正数的原码,反码,补码都一样 (三码合一) 3) 负数的反码=它的原码符号位不变,其它位取反(0->1,1- ...

  2. day017:Java进制转换、原码反码补码、位运算、位移运算符

    一.进制介绍: 1.进制:指进位制,表示某一位置上的数,运算时是逢X进一. 十进制就是逢十进一,二进制就是逢二进一,八进制就是逢八进一. 2.Java中默认的数值都是十进制,如果要输入其他进制,在数值 ...

  3. 原码 反码 补码的相互转换

    原码 反码 补码的相互转换 原码 反码 补码的转换 还是比较 简单基础的问题.之前学习java的时候就学过,后来忘记了,忘记了!!!,后来学了位移运算符,左移 右移 无符号右移 之后就由有点儿懵了. ...

  4. 正数负数的原码、反码、补码

    假设有一个 int 类型的数,值为5,那么,它在计算机中表示为: 00000000 00000000 00000000 00000101 5转换成二制是101,不过int类型的数占用4字节(32位), ...

  5. 原码 反码 补码 之间在小数正数间的转换

    原码 反码 补码 之间在小数正数间的转换 基本转换 对于正数 原码等于反码等于补码(小数也一样) 对于负数 原码除了符号位取反即反码 反码基础之上+1即补码 但是在遇到某些题时候还是会混淆,比如三者在 ...

  6. 负数的原码反码和补码

    As we all know,正数的三码都一样,注意一下最高位为符号位即可: 负数的原码最高位为1,与真值之间换算方便,但对于做减法的操作却很无力,于是引进了反码和补码:负数的反码为它的正数按位取反, ...

  7. 负数的二进制 原码反码补码

    https://blog.csdn.net/weixin_38296030/article/details/88353914 问题来源: "为毛   -x=!x+1  ??? 其中x为一任意 ...

  8. 正负数在计算机中的表示(原码反码补码)及位运算

    负数在现代计算机里一般用补码表示(正数也是) 正数补码就是它的原码 负数补码: 最高位是符号位,其余位为对应整数的原码取反再+1 如:1000 0000还原为原码:最高位是1,表示负数,剩余的各位取反 ...

  9. 关于计算机中 原码, 反码, 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  10. 原码, 反码, 补码, 移码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

最新文章

  1. JVM NativeMemoryTracking 分析堆外内存泄露
  2. STM32 基础系列教程 20 - RTC
  3. html的input不可编辑状态,HTML中让表单input不可编辑的方法
  4. UIControl事件---iOS-Apple苹果官方文档翻译
  5. 过程声明与同名事件或过程的描述不匹配_多特征结合的倾斜无人机影像匹配方法...
  6. 源代码管理工具优缺点
  7. 点乘叉乘坐标公式_点积与叉乘的运算与物理意义
  8. linux引导时输入特殊信息的含义
  9. oracle 取时间比较,Oracle最大日期获取方法
  10. SQL注入自动扫描工具中的语句
  11. df满足条件的值修改_如何用python实现熵值法求指标权重(实例)
  12. SYN flood***的原理及其防御 (一)
  13. VOT 2019 RGB-TIR数据集下载教程
  14. 自下而上分析方法-算符优先,LR(0),SLR,LR(1),LALR大全
  15. data[i] is underfined
  16. Bellman_Ford模版
  17. java计算机毕业设计疫情期间高校师生外出请假管理系统录屏源代码+系统+数据库+lw文档
  18. SQL server不能用IP登录
  19. 交互设计师必须知道的五大交互设计流程
  20. fastlane提交AdHoc测试包到蒲公英平台,获取git提交信息展示到更新说明中

热门文章

  1. math_角函数反三角函数诱导公式三角/反三角恒等式
  2. 【数学分析】从多元函数的定义一直到多元函数的泰勒展开
  3. 世界观和方法论是一致的,有怎样的世界观就有怎样的方法论
  4. Muli3D 7 判断Ray与Sphere的关系
  5. STM32之串口的使用
  6. RGB与HSV是什么,为什么要进行转换
  7. iPhone X 适配
  8. 程序设计所遵循的一般步骤
  9. Windows值得推荐的桌面管理软件
  10. 记录大坑:用Xamarin引入UHF读写器dll,报错: 所生成项目的处理器架构“MSIiL”与引用的Reader.dll处理器架构“x86”不匹配