二进制数的原码、反码、补码(详解)
创始人
2024-05-27 11:07:01
0次

一、原码、反码、补码产生原因

由于计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储。

根据冯·诺依曼提出的经典计算机体系结构框架,一台计算机由运算器、控制器、存储器、输入和输出设备组成。其中运算器只有加法运算器,没有减法运算器(据说一开始是有的,后来由于减法运算器硬件开销太大,被废了)。

所以计算机中没办法直接做减法的,它的减法是通过加法实现的。现实世界中所有的减法也可以当成加法的,减去一个数可以看作加上这个数的相反数,但前提是要先有负数的概念,这就是为什么不得不引入一个符号位。符号位在内存中存放的最左边一位,如果该位位0,则说明该数为正;若为1,则说明该数为负。

而且从硬件的角度上看,只有正数加负数才算减法,正数与正数相加,负数与负数相加,其实都可以通过加法器直接相加。

原码、反码、补码的产生过程就是为了解决计算机做减法和引入符号位的问题。

二、原码

原码:是最简单的机器数表示法,用最高位表示符号位,其他位存放该数的二进制的绝对值。

以带符号位的八位二进制数为例:0010,最高位为1表示这是个负数,在右数第2位有个1,即1*2^1=2,所以表示十进制数-2。

一部分带符号的四位二进制数原码
数值二进制原码数值二进制原码
10001-11001
20010-21010
30011-31011
40100-41100
50101-51101

6

0110-61110

二、反码

原码最大的问题在于一个数加上它的负数不等于0,于是反码的设计思想就是为了解决这个问题。

既然一个负数时一个正数的相反数,干脆把一个正数的二进制按位取反来表示它的负数。

反码:正数的反码和原码一致;负数的反码就是它的原码除符号位外,按位取反。

部分正负数的二进制反码
正数正数的原码(反码相同)负数负数的原码负数的反码
10001-110011110
20010-210101101
30011-310111100
40100-411001011
50101-511011010
60110-611101001

三、补码

补码:正数的原码、反码、补码都一致;负数的补码等于反码+1。

负数的补码等于反码+1只是补码的求法,而不是补码的定义。如果有兴趣可以看到《计算机组成原理》,它会用”模“和”同余“的概念,严格的解释补码。

部分正负数的二进制补码
正数正数的原码、反码、补码负数负数的原码负数的反码负数的补码
10001-1100111101111
20010-2101011011110
30011-3101111001101
40100-4110010111100
50101-5110110101011
60110-6111010011010

四、举个例子

求~6的值(取反)。

  1. 6是正数,原码、反码、补码一致,所以6的补码是0000 0110(我们模拟八位的二进制)。
  2. 将补码0000 0110进行”~“计算(按位取反),得到补码1111 1001。
  3. 再讲补码1111 1001转换为原码,先减1拿到反码,1111 1000,再取反(符号位不变)得到原码1000 0111。
  4. 将原码1000 0111转换成十进制,得到-7。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...