一、前置概念
计算机底层存储数据时使用的是二进制数字,但是计算机在存储一个数字时并不是直接存储该数字对应的二进制数字,而是存储该数字对应二进制数字的补码。
在了解原码,反码,补码之前,需要先了解机器数和真值的概念:
1、机器数
一个数在计算机的存储形式是二进制数,我们称这些二进制数为机器数,机器数有符号,在计算机中用机器数的最高位存放符号位,0表示正数,1表示负数
2、真值
因为机器数带有符号位,所以机器数的形式值不等于其真实表示的值(真值),以机器数10000001为例,其真正表示的值为-1(首位为符号位,即这里首位1表示负数,无计数含义),而形式值为129(首位就是代表1,无正负含义,仅起计数作用);因此将带符号的机器数的真正表示的值成为机器数的真值。
二、原码、反码、补码
1、原码
原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值,也就是:
正数:就是它对应的二进制数。
负数:将绝对值对应的二进制最左边位变为1
举例:十进制:+1,-1,使用8位二进制的原码表示如下
十进制 +1 =(原码)0000 0001
//此处左边0表示正数,同时由于为0,不影响计数,故真值与形式值相同
十进制 -1 = (原码)1000 0001
//此处左边首位1即代表负号,无计数含义,但由于其为1,影响形式值计数,故二值不同
2、反码
正数:和原码相同
负数:在其原码的基础上,符号位不变,其余各位取反
十进制 +1 = (原码)0000 0001 =(反码)0000 0001 //和原码相同
十进制 -1 = (原码)1000 0001 =(反码)1111 1110 //符号位不变,其余取反
3、补码
正数:补码是其原码本身
负数:补码是在其原码的基础上,符号位不变,其余各位取反后加1(即在反码的基础上加1).
三、数据在计算机中的存储形式
计算机实际只存储补码,所以原码转换为补码的过程,也可以理解为数据存储到计算机内存中的过程:
具体流程如下:
在原码,反码,补码中,正数的表示是一模一样的,而负数的表示是不相同的,所以对于负数的补码来说,我们是不能直接用进制转换将其转换为十进制数值的,因为这样是得不到计算机真正存储的十进制数的,所以应该将其转换为原码后,再将转换得到的原码进行进制转换为十进制数(机器数包含符号位)
四、为何使用原码、反码、补码····原码、补码、反码演进的过程
理解梗概:为解决计算机计算减法的问题。
出现原因:计算机的运算器中只有加法器,所以要将减法转换为加法来计算。
不求甚解:就是计算机为了计算减法而做的一系列复杂换算