序
我的很多朋友在学习计算机相关课程的时候经常会听到原码、反码、补码等词汇,但是很少有人能理解它们是为了什么。但是,随着编程的深入,我们知道计算机中只能存储0和1的二进制代码,所有的数据类型最终都会转换成二进制代码,然后存储在内存中。因此,了解这些知识可以帮助你理解数值是如何存储在内存中的。
而小数转换也是一个关键点,无论是大学的期末考试还是求职的面试题,这都是需要理解的知识。今天冷月就带大家整理一下原码、补码的相关知识,讲解十进制转换的方法。
原码形式
原始代码也叫符号-绝对值代码;最高位0表示正数,最高位1表示负数,其余二进制位是数字绝对值的二进制位。也就是说,原始代码的最高位代表它是正的还是负的,而剩余的数字代表特定的值。
例如,如果我们用8位二进制表示一个数字,那么11的原始代码是00001011,而-11的原始代码是10001011。
原码简单易懂,但其加减运算复杂,零的表示也不是唯一的,因此不与数值的原码直接存储在计算机中。
基数减一补码
反码通常是一种过渡码,用于从原始码中寻找补码或从补码中寻找原始码。一点一点地反转直接二进制。但是,反码的操作是不重复的,在电脑上是不用的。
假设我们用8位二进制来表示一个数,11的反码是11110100,而-11的原码是01110100。
补充
在计算机系统中,数值总是用补码来表示和存储。原因是有了补码,符号位和数值域可以统一处理;同时,加减法也可以统一。
如下图所示:
821法律
将二进制转换为十六进制的简单方法。简单来说,十六进制意味着16个状态,而二进制数字需要4位数字来表示16个状态。所以我们用4位二进制数来表示1位十六进制数,不足的数字前面加零。
对应的4位二进制数在十进制中等于8 4 2 1。
如下图所示:
基数转换(补码)
众所周知,十进制寻道二进制:
求正整数的二进制(补)数:除2取余数,直到商为0,余数逆序排列。
求负整数的二进制(补码):先求负数对应的正整数的二进制补码,然后将所有的位反相,最后加1,位数不够时向左加1。
寻零二进制(补码):全为零。
# includestdio.h
/*
微信官方账号:高级冷月
*/
int main()
{
printf('%#Xn ',18);//输出0X12
printf('%#Xn ',-18);//输出0xfffffe ee
返回0;
}
我们来分析一下上面的操作。我们知道正数的原码、补码、补码都是一样的。在C语言中,int类型在内存中分配4个字节,即32位。在C语言中,二进制不能直接输出,所以我们输出十六进制。如下图所示:
十进制的已知二进制补码:
如果第一位数字为0,表示是正整数,用普通方法计算;如果第一个数字是1,则表示它是负整数。如果所有的数字都是反相的,并且在末尾加上1,则得到的数字就是负数的绝对值。如果都是零,对应的十进制数为零。
# includestdio.h
/*
微信官方账号:高级冷月
*/
int main()
{
printf('%dn ',0X12);//输出18
printf('%dn ',0xfffffffee);//输出-18
返回0;
}
上述操作被称为十进制和二进制的逆过程。计算过程如下:
如果这篇博文对你有帮助,你可以给冷月一个赞或者加一个关注!