文章转自: http://c.biancheng.net/

文章目录

  • 1. 原码
  • 2. 反码
  • 3. 补码
  • 4. 补码到底是如何简化硬件电路的
  • 5. 实例分析

1. 原码

将一个整数转换成二进制形式,就是其原码。例如short a = 6; a 的原码就是0000 0000 0000 0110;更改 a 的值a = -18; 此时 a 的原码就是1000 0000 0001 0010

通俗的理解,原码就是一个整数本来的二进制形式。

2. 反码

对于正数,它的反码就是其原码(原码和反码相同);负数的反码是将原码中除符号位以外的所有位(数值位)取反,也就是 0 变成 1,1 变成 0。例如short a = 6; a 的原码和反码都是0000 0000 0000 0110;更改 a 的值a = -18; 此时 a 的反码是1111 1111 1110 1101

3. 补码

对于正数,它的补码就是其原码(原码、反码、补码都相同);负数的补码是其反码加 1。例如short a = 6; a 的原码、反码、补码都是0000 0000 0000 0110;更改 a 的值a = -18; 此时 a 的补码是1111 1111 1110 1110

可以认为,补码是在反码的基础上打了一个补丁,进行了一下修正,所以叫“补码”。

原码、反码、补码的概念只对负数有实际意义,对于正数,原码、反码、补码都是一样的。

最后总结一下 6 和 -18 从原码到补码的转换过程:

在计算机内存中,整数一律采用补码的形式来存储。这意味着,当读取整数时还要采用逆向的转换,也就是将补码转换为原码。将补码转换为原码也很简单:先减去 1,再将数值位取反即可。

4. 补码到底是如何简化硬件电路的

由于整数在内存中是以补码表示的,那么计算机只要设计一种简单的、不用区分符号位和数值位的加法电路,就能同时实现加法和减法运算,并且非常高效,极大简化了计算机的硬件电路

下面演示了按照补码计算的过程:

6 - 18 = 6 + (-18)
= [0000 0000 0000 0110]补 + [1111 1111 1110 1110]补
= [1111 1111 1111 0100]补
=  [1111 1111 1111 0011]反
= [1000 0000 0000 1100]原
= -1218 - 6 = 18 + (-6)
= [0000 0000 0001 0010]补 + [1111 1111 1111 1010]补
= [1 0000 0000 0000 1100]补
= [0000 0000 0000 1100]补
= [0000 0000 0000 1100]反
= [0000 0000 0000 1100]原
= 125 - 13 = 5 + (-13)
=  [0000 0000 0000 0101]补 + [1111 1111 1111 0011]补
= [1111 1111 1111 1000]补
= [1111 1111 1111 0111]反
= [1000 0000 0000 1000]原
= -813 - 5 = 13 + (-5)
= [0000 0000 0000 1101]补 + [1111 1111 1111 1011]补
= [1 0000 0000 0000 1000]补
= [0000 0000 0000 1000]补
= [0000 0000 0000 1000]反
= [0000 0000 0000 1000]原
= 8

5. 实例分析

有符号数以无符号的形式输出,或者无符号数以有符号的形式输出时,会得到一个奇怪的值,请看下面的代码:

#include <stdio.h>int main()
{short a = 0100;  //八进制int b = -0x1;  //十六进制long c = 720;  //十进制unsigned short m = 0xffff;  //十六进制unsigned int n = 0x80000000;  //十六进制unsigned long p = 100;  //十进制//以无符号的形式输出有符号数printf("a=%#ho, b=%#x, c=%lu\n", a, b, c);//以有符号数的形式输出无符号类型(只能以十进制形式输出)printf("m=%hd, n=%d, p=%ld\n", m, n, p);return 0;
}

运行结果:

a=0100, b=0xffffffff, c=720
m=-1, n=-2147483648, p=100

其中b、m、n 的输出结果看起来非常奇怪。

b 是有符号数,它在内存中的存储形式(也就是补码)为:

b = -0x1
= [1000 0000 …… 0000 0001]原
= [1111 1111 …… 1111 1110]反
= [1111 1111 …… 1111 1111]补
= [0xffffffff]补

%#x表示以无符号的形式输出,而无符号数的补码和原码相同,所以不会转换,直接输出 0xffffffff 。

m 和 n 是无符号数,它们在内存中的存储形式为:

m = 0xffff
= [1111 1111 1111 1111]补n = 0x80000000
= [1000 0000 …… 0000 0000]补

%hd%d表示以有符号的形式输出,所以还要经过一个逆向的转换过程:

[1111 1111 1111 1111]补
= [1111 1111 1111 1110]反
= [1000 0000 0000 0001]原
= -1[1000 0000 …… 0000 0000]补
= -231
= -2147483648

由此可见,-1 和 -2147483648 才是最终的输出值。

注意,[1000 0000 …… 000 0000]补是一个特殊的补码,无法按照本节讲到的方法转换为原码,所以计算机直接规定这个补码对应的值就是 -231

原码、反码、补码详解相关推荐

  1. 原码, 反码, 补码 详解(转载)

    原码, 反码, 补码 详解(转载) 繁星*墨菲 于 2020-05-23 10:22:53 发布1015 收藏 75 版权 转载地址:原码, 反码, 补码 详解 - ziqiu.zhang - 博客园 ...

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

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

  3. 原码 反码 补码 详解

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...

  4. 原码 反码 补码 详解

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

  5. 原码, 反码, 补码详解——北大陈向群老师课堂笔记

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符 ...

  6. 原码, 反码, 补码 详解

    本文转载于: 作者:张子秋 出处:http://www.cnblogs.com/zhangziqiu/ 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进 ...

  7. 二进制原码反码补码详解

    二进制原码反码补码 首先我们在了解什么是原码,反码,补码之前,我们先来谈谈为什么需要有这些,只要原码不行吗? 答案肯定是不行的!

  8. 源码 反码 补码详解(为什么计算机存储数值为补码形式?)

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...

  9. 嵌入式系统学习整理-FourDay-原码反码补码详解

    目录 一.前言 一.原码.反码.补码定义 1. 原码 2. 反码 3. 补码 二.补码的加减计算 一.前言 首先,要知道计算机底层都以二进制表示,数字也不例外,那么,如果数字加减运算的话,要怎么算呢? ...

  10. Java修炼之凡界篇 筑基期 第02卷 语法 番外1 原码 反码 补码

    原码 反码 补码 博客整理自 原码, 反码, 补码 详解 - ziqiu.zhang - 博客园 (cnblogs.com) 机器数与真值 在学习原码.反码和补码之前,需要先了解什么是机器数,什么是真 ...

最新文章

  1. 《迷人的8051单片机》----3.4 程序
  2. Py之glob: glob库文件名模式匹配+返回所有匹配的文件路径列表库的简介、使用方法之详细攻略
  3. 17款加速效率的CSS工具
  4. JVM 调优和垃圾回收器说明
  5. 【Python基础知识-pycharm版】第十节_异常
  6. 原创《如何用vue来轻松的驾驭 html5 webapp的页面体验》
  7. 更改centos epel源
  8. 客户关系管理系统中实现对客户信息标记颜色的处理
  9. 谷歌新旗舰Pixel 3让AI帮你接电话:你是谁?为什么来电?
  10. 自动驾驶感知-车道线系列(三)——霍夫变换
  11. Elasticsearch实践(四):IK分词
  12. 大数据之路,阿里巴巴大数据实践
  13. 大数据数据库(HBase)
  14. 计算机无法添加本地策略组,解决win10找不到本地组策略和本地用户的方法
  15. 一个自动写咪蒙体的机器人,请夸我
  16. less面试_面试必看:less与sass的区别
  17. 我女儿说要看雪,于是我默默的拿起了键盘,下雪咯,程序员就是可以为所欲为!
  18. 内农大《嵌入式基础》实验一 Shell编程
  19. 极速office怎么才能自定义PPT幻灯片大小
  20. win10系统下如何配置免安装版python(U盘版)及第三方库

热门文章

  1. mysql去掉字段中的所有空格
  2. Java 自带性能监控工具:监视和管理控制台 jconsole 的使用
  3. iOS学习笔记-105.多线程04——CGD基础
  4. 实时PCR的双标记荧光探针BHQ-3 acid,1338332-66-3,BHQ-3可以位于5或3末端或寡核苷酸的内部
  5. 社会化媒体营销的六大步骤
  6. 原创:《Python之路实战40篇》PDF高清版,限时下载!
  7. 计算机维护与管理的内容有哪些,简析计算机管理与维护.docx
  8. elastic search,又一个基于lucene的nosql好项目
  9. 计算机软件都打不开了,我的电脑的所有软件都打不开了,请问怎么回事?能解决么???...
  10. 创业者必须掌握的10大技巧