补码和原码的转化带你快速了解原码和反码与补码或搞定进制转换补码,反码和原码的转化




补码和原码的转化带你快速了解原码和反码与补码或搞定进制转换补码,反码和原码的转化

2022-07-21 2:26:22 网络知识 官方管理员

前言

很多的小伙伴在学习计算机相关课程的时候,经常会听到原码反码补码等词语,但是很少有人能够理解它们具体是干嘛的。但是随着编程的深入,我们知道在计算机中只能存储0和1的二进制码,所有数据类型最后都会转为二进制码再存储到内存中。所以理解这些知识能够帮助你理解数值在内存当中的存储方式。

并且进制转换也是一个重点,不管是在大学的期末考试还是找工作的面试题,这都是需要了解的知识。今天冷月就带大家来梳理一下原码、反码、补码的相关知识,并讲解一下进制转换的方法。

原码

原码也叫符号-绝对值码;最高位0则表示正数,最高位1则表示负数,其余的二进制位是该数字的绝对值的二进制位。也就是说原码的最高位代表他是正数或者是负数,而其余的位数才代表具体的值。

举个例子:假如:我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011

原码简单易懂,但是它的加减运算复杂,而且零的表示不唯一,所以在计算机中并不是直接用数值的原码来存储。

反码

反码通常是用来由原码求补码或者由补码求原码的过渡码。直接将二进制位按位取反。而反码的运算不遍,也没有在计算机中应用。

假如:我们用8位二进制表示一个数,+11的反码为11110100,-11的原码就是01110100

补码

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。

如下图所示:

补码和原码的转化(带你快速了解原码和反码与补码或搞定进制转换)(1)

8421法

一种2进制转16进制的简便方法。简单来说16进制也就是表示16种状态,而二进制数要表示16种状态,则需要4位才能够表示。所以我们用4位二进制数来表示1位16进制数,不够的位数前面补0。

而对应的4位二进制数分别等于10进制的8421。

如下图所示:

补码和原码的转化(带你快速了解原码和反码与补码或搞定进制转换)(2)

进制转换(求补码)

已知十进制求二进制:

求正整数的二进制(补码):除2取余,直至商为0,余数倒序排列。

求负整数的二进制(补码):先求与该负数相对应的正整数的二进制补码,然后将所有位取反,末尾加1,不够位数时,左边补1。

求零的二进制(补码):全是0。

#include<stdio.h>

/*

公众号:学长冷月

*/

intmain()

{

printf("%#X\n",18);//输出0X12

printf("%#X\n",-18);//输出0XFFFFFFEE

return0;

}

我们来分析一下上面的运行情况。我们知道正数的原码、反码、补码相同,在C语言中int类型在内存中分配4个字节,也就是32位。而C语言中不能直接输出二进制,所以我们输出16进制。如下图所示:

补码和原码的转化(带你快速了解原码和反码与补码或搞定进制转换)(3)

已知二进制补码求十进制:

如果首位是0,则表明是正整数,按普通方法来求;如果首位是1,则表明是负整数,将所有位取反,末尾加1,所得数字就是该负数的绝对值;如果全是0,则对应的十进制数字就是0

#include<stdio.h>

/*

公众号:学长冷月

*/

intmain()

{

printf("%d\n",0X12);//输出18

printf("%d\n",0XFFFFFFEE);//输出-18

return0;

}

上面的运行情况就是已知十进制求二进制的逆过程。计算过程如下图:

补码和原码的转化(带你快速了解原码和反码与补码或搞定进制转换)(4)

发表评论:

最近发表
网站分类
标签列表