原码、反码、补码详解
文章转自: 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
原码、反码、补码详解相关推荐
- 原码, 反码, 补码 详解(转载)
原码, 反码, 补码 详解(转载) 繁星*墨菲 于 2020-05-23 10:22:53 发布1015 收藏 75 版权 转载地址:原码, 反码, 补码 详解 - ziqiu.zhang - 博客园 ...
- 关于计算机中 原码, 反码, 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 原码 反码 补码 详解
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...
- 原码 反码 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 原码, 反码, 补码详解——北大陈向群老师课堂笔记
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符 ...
- 原码, 反码, 补码 详解
本文转载于: 作者:张子秋 出处:http://www.cnblogs.com/zhangziqiu/ 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进 ...
- 二进制原码反码补码详解
二进制原码反码补码 首先我们在了解什么是原码,反码,补码之前,我们先来谈谈为什么需要有这些,只要原码不行吗? 答案肯定是不行的!
- 源码 反码 补码详解(为什么计算机存储数值为补码形式?)
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...
- 嵌入式系统学习整理-FourDay-原码反码补码详解
目录 一.前言 一.原码.反码.补码定义 1. 原码 2. 反码 3. 补码 二.补码的加减计算 一.前言 首先,要知道计算机底层都以二进制表示,数字也不例外,那么,如果数字加减运算的话,要怎么算呢? ...
- Java修炼之凡界篇 筑基期 第02卷 语法 番外1 原码 反码 补码
原码 反码 补码 博客整理自 原码, 反码, 补码 详解 - ziqiu.zhang - 博客园 (cnblogs.com) 机器数与真值 在学习原码.反码和补码之前,需要先了解什么是机器数,什么是真 ...
最新文章
- 《迷人的8051单片机》----3.4 程序
- Py之glob: glob库文件名模式匹配+返回所有匹配的文件路径列表库的简介、使用方法之详细攻略
- 17款加速效率的CSS工具
- JVM 调优和垃圾回收器说明
- 【Python基础知识-pycharm版】第十节_异常
- 原创《如何用vue来轻松的驾驭 html5 webapp的页面体验》
- 更改centos epel源
- 客户关系管理系统中实现对客户信息标记颜色的处理
- 谷歌新旗舰Pixel 3让AI帮你接电话:你是谁?为什么来电?
- 自动驾驶感知-车道线系列(三)——霍夫变换
- Elasticsearch实践(四):IK分词
- 大数据之路,阿里巴巴大数据实践
- 大数据数据库(HBase)
- 计算机无法添加本地策略组,解决win10找不到本地组策略和本地用户的方法
- 一个自动写咪蒙体的机器人,请夸我
- less面试_面试必看:less与sass的区别
- 我女儿说要看雪,于是我默默的拿起了键盘,下雪咯,程序员就是可以为所欲为!
- 内农大《嵌入式基础》实验一 Shell编程
- 极速office怎么才能自定义PPT幻灯片大小
- win10系统下如何配置免安装版python(U盘版)及第三方库
热门文章
- mysql去掉字段中的所有空格
- Java 自带性能监控工具:监视和管理控制台 jconsole 的使用
- iOS学习笔记-105.多线程04——CGD基础
- 实时PCR的双标记荧光探针BHQ-3 acid,1338332-66-3,BHQ-3可以位于5或3末端或寡核苷酸的内部
- 社会化媒体营销的六大步骤
- 原创:《Python之路实战40篇》PDF高清版,限时下载!
- 计算机维护与管理的内容有哪些,简析计算机管理与维护.docx
- elastic search,又一个基于lucene的nosql好项目
- 计算机软件都打不开了,我的电脑的所有软件都打不开了,请问怎么回事?能解决么???...
- 创业者必须掌握的10大技巧