原码、反码、补码、移码的公式推导

2024-03-21 09:59

本文主要是介绍原码、反码、补码、移码的公式推导,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一点废话

关于这几个码早在n年前看过的了,后来也只记得补码,正好今天看到了这几个码的公式,就顺便记录下并尝试推导下。

很多同学可能觉得直接把公式记住就行了,但我还是觉得复习不能光图快,在理解的基础上去记会更好,或者压根儿就不用记。

原码

规则 :0表示正号,1表示负号,其余n-1位表示数值的绝对值。
按照这个定义,我们很容易写出(n = 4):

(十进制)5 = (二进制)0101
(十进制)-5 = (二进制)1101

本来觉得原码挺简单,但是看了这么个公式,不免心中一居灵。
在这里插入图片描述
其实静心想想也不难。

我们先看下整数。

1. 取值范围

因为n位中首位表示符号,所以只有后n-1位表示数值,所能表示的最大位为后n-1全是1的情形,其十进制值为:

20 + 21 + … + 2n-2 = 2n-1 - 1(等比数列求和公式)

比如上面n=4时,所能表示最大的正数为7,就是0111。
同理我们可以推出下限为-(2n-1 - 1)。

细心的同学应该发现整数的两个定义域中都有0,这是由原码的定义决定的:
十进制0在原码中有两种表示:
+0 = 0 00…0
-0 = 1 00…0

2. 表达式

当X ∈ \in [0, 2n-1 - 1]时,X为其本身很好理解,那么X ∈ \in [2n-1 - 1,0],为什么是2n-1 - 1 + |X|呢?

因为负数就是在正数的基础上把最高位由0改成了1,对应的十进制为增加了2n-1

再来看看小数。

在看小数之前,我们先学习下定点小数的表示,n位
(a0 a1 … an-1)表示的十进制小数为:
a0 * 20 + a1 * 2-1 + … + an-1 * 2-1(n-1)
如0101 = 0 + 1/2 + 0 + 1/8 = 5/8 = 0.125
所以在最高位将0换成1,实际上是加了20 = 1。

反码

规则:0变成1,1变成0。
在这里插入图片描述
下面我们推导为什么负数是2n - 1 - X。

当X > 0时,其二进制n位表示为:
(0 a1 … an-1),其中ai = 0或1,i ∈ \in (0,n)。

即X = 0 * 2n-1 + a1 * 2n-2 + … + an-1 * 20

当X < 0时,则根据反码规则,其二进制X的n位表示为:
(1 1-a1 … 1-an-1),其中ai = 0或1,i ∈ \in (0,n)。

即X = 1 * 2n-1 + (1-a1) * 2n-2 + (1-an-1) * 20 = 2n-1 + 2n-2 + 20 - |X| = 2n - 1 + X

关于小数场景,我们可以同样推导出:
X < 0时,X = 1 * 20 + (1-a1) * 2-1 + … + (1-an-1) * 2-(n-1) = 2 - 2-(n-1) + X

补码

规则:负数为正数的反码加1。
在这里插入图片描述
1. 取值范围
相比原码和反码,补码的取值范围多了一个-2n-1,这是因为0只有一种表达。
2. 表达式
因为补码的变换是在反码的基础上+1,即在十进制上加了20 = 1,所以负数的表达式中同样+1,结果为2n + X。

而在小数中,反码二进制+1其实是在其十进制上加了2-(n-1)。
在这里插入图片描述

故结果为2 + X。

移码

规则:X上增加偏移量2n-1
在这里插入图片描述
整数表达式由定义就可以得出。

小数为什么是1 + X呢?因为2n-1个偏移量相当于在最高位加1,
在这里插入图片描述

所以是在X的基础上加了20=1,故为1+X。
因为X ∈ \in [-1,1),则只有x = -1时有溢出,此时溢出后结果为010,根据公式X[] = 1 + X也为0。

最后,我们再证明下:
在这里插入图片描述
正数(无论是整数还是小数)没什么好说的,补码表示时最高位是0,偏移2n-1就是把最高位改成1。

负数时,补码是取反加1,移码是加2n-1,为什么两者转换后的结果只是最高位不一样呢?

从表达式看,负数补码为:2n + X, 移码为 2n-1 + X,而2n + X = 2n-1 + X + 2n-1,也就是说把移码再偏移2n-1就会变成补码,即取反最高位(考虑溢出)。

结后语

在复习过程中,我们不能为了考试而考试,更应该注重学习方法的培养,做到知其所以然。

这篇关于原码、反码、补码、移码的公式推导的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832373

相关文章

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

二维旋转公式

二维旋转公式 ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。 1. 二维旋转公式(算法) 而(此文只针对二维)旋转则是表示某一坐标点 ( x

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决 问题描述 最近在投一篇期刊论文,直接提交word文档,当时没有查看提交预览,一审审稿意见全是:公式乱码、公式乱码、乱码啊!!!是我大意了,第二次提交,我就决定将word文档转成PDF后再提交,避免再次出现公式乱码的问题。接着问题又来了,我利用‘文件/导出’或‘文件/另存为’的方式将word转成PDF后,发现公式

不同饭局,如何说开场白才能打开氛围?教你一个万能公式

在人情社会中,饭局不仅是吃饱饭的场合,更是人际交往、情感交流的重要平台。无论是家庭聚会、商务宴请、朋友相聚还是同事联谊,一个恰当的开场白都能迅速打破沉默,营造温馨和谐的氛围。 针对现实生活中最常见的四种饭局,酱酒亮哥教你一个万能开场白公式,这个公式分为四步,当然,不是一步不落的照搬,需要灵活应用,挑其中的两步、三步就行了,只要打开氛围,我们的目的也就达到了。接下来我们一起学习一下,希望你在不同的

【无线通信发展史⑧】测量地球质量?重力加速度g的测量?如何推导单摆周期公式?地球半径R是怎么测量出来的?

前言:用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注,你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢? 首先肯定是因为我本身就是一名从业通信者,想着更加了解自己专业的知识,所以更想着从头开始了解通信的来源以及在每一个时代的发展进程。 为什么会从头开始写通信? 我最早是学习了中华上下五千年,应该说朝代史,这个算个人兴趣,从夏

UVA10071(重温高中物理公式)

Back to High School Physics Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18809 Description A parti

CF #278 (Div. 2) B.(暴力枚举+推导公式+数学构造)

B. Candy Boxes time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/488/problem/B There

HLJUOJ1127 HDU2049(错排公式+排列组合)

1127: 递推求解专题练习二 Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 20   Solved: 8 [ Submit][ Status][ Web Board] Description 在电影院看电影时,总会有观众坐错座位号的情况。现在正在首播的青春爱情喜剧悬疑科幻大片《来治猩猩的你》观影现场爆满(满席)。 那么问题来了

HDU2524(规律推导)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2524 解题思路: 暴力推出矩阵,以n = 2 , m = 4为例: 1 3  6  10 3 9 18 30 可以发现第一行和第一列都是有规律的,彼此相差2、3、4·····,其他元素为相应行第一个元素乘以第一列元素的积。预处理之后,我们O(1)就可以输出g[n][m]的值。 另外,