前言
很多的小伙伴在学习计算机相关课程的时候,经常会听到原码、反码、补码等词语,但是很少有人能够理解它们具体是干嘛的。但是随着编程的深入,我们知道在计算机中只能存储0和1的二进制码,所有数据类型最后都会转为二进制码再存储到内存中。所以理解这些知识能够帮助你理解数值在内存当中的存储方式。
并且进制转换也是一个重点,不管是在大学的期末考试还是找工作的面试题,这都是需要了解的知识。今天冷月就带大家来梳理一下原码、反码、补码的相关知识,并讲解一下进制转换的方法。
原码
原码也叫符号-绝对值码;最高位0则表示正数,最高位1则表示负数,其余的二进制位是该数字的绝对值的二进制位。也就是说原码的最高位代表他是正数或者是负数,而其余的位数才代表具体的值。
举个例子: 假如:我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011
一个数怎么求原码,原码简单易懂,但是它的加减运算复杂,而且零的表示不唯一,所以在计算机中并不是直接用数值的原码来存储。
反码
假如:我们用8位二进制表示一个数,+11的反码为11110100,-11的原码就是01110100
补码
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
如下图所示:
8421法
一种2进制转16进制的简便方法。简单来说16进制也就是表示16种状态,而二进制数要表示16种状态,则需要4位才能够表示。所以我们用4位二进制数来表示1位16进制数,不够的位数前面补0。
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。反码就是正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。补码就是正数的补码就是其本身,负数的补码是在其原码。
而对应的4位二进制数分别等于10进制的8 4 2 1。
如下图所示:
进制转换(求补码)
已知十进制求二进制:
求正整数的二进制(补码):除2取余,直至商为0,余数倒序排列。
求负整数的二进制(补码):先求与该负数相对应的正整数的二进制补码,然后将所有位取反,末尾加1,不够位数时,左边补1。
求零的二进制(补码):全是0。
*
计算机中,只有补码,没有原码和反码。数字,在计算机中,一律用补码表示。数字与补码的关系,可见下表:换算公式,很简单的,一看便知。原码反码取反加一,实际上,都没有什么用处。老外数学不好,才不得不用这么麻烦的做法。
公众号:学长冷月
*
int main()
{
printf(&X\n",18); //输出0X12
printf(&X\n",-18); //输出0XFFFFFFEE
return 0;
}
已知二进制补码求十进制:
原码就是符号位加上真值的绝对值 正数 : 正数的反码 = 原码 如: +3 = 0000 0011[原码] = 0000 0011 [反码]负数 : 符号为不变 ,其余各位直接取反 , 1->0 0->1 计算机中数据以补码的形式,同样以。
如果首位是0,则表明是正整数,按普通方法来求; 如果首位是1,则表明是负整数,将所有位取反,末尾加1,所得数字就是该负数的绝对值; 如果全是0,则对应的十进制数字就是0
*
公众号:学长冷月
*
int main()
{
printf(&34;,0X12); //输出18
用不存在的“原码反码取反加一”来求,也是这个结果。求负数补码的计算公式,也是: 周期 + 该负数。正数,也可以使用这个公式。但是,计算后,这个周期的数值,超出了计数范围,就略去了。 最后,还是这个正数。--- 。
printf(&34;,0XFFFFFFEE); //输出-18
return 0;
}
上面的运行情况就是已知十进制求二进制的逆过程。计算过程如下图:
如果这篇博文有帮助到您,可以帮冷月点一个赞或者加一个关注哦!