大家都知道计算机都是以二进制存储的,也就是计算机只认识01.但是01也是有身份的好不。
那么今天我们就来看看01都有什么身份。
在计算机里都是以补码的形式存储数据!哎,补码就是01的一个身份标识。
返回来,计算机张口说话了,它说,小伙子,我给你一个补码,你看看认识这是啥吗?
因为计算机只认识补码
【
为什么计算机要以补码形式存储呢?为啥不用中文存储呢,因为我是中国人啊!很好,就要有提问的精神,先不管提的问题靠不靠谱。
因为cpu里有加法器,会进行加法计算。没有减法器哦。
那么如果要计算5-5怎么计算的呢?转换一下5+(-5),嘿嘿,哎呦我的小聪明!
5的原码00000101
-5的原码10000101
把两个二进制相加=10001010 ,最高位1是负数。剩下7位表示 10 。最后结果是-10;错误。不能通过原码计算
5的反码00000101
-5的反码11111010
把两个二进制相加=111111111 得到的是反码,因为我们人只知道原码,再把反码转成原码=100000000 。最高位1是负数。其他位得到0 结果是-0.哎呀,是对的啊。但是
00000000这个也表示0啊(只是第一位是符号位)。100000000也表示0啊(只是第一位是符号位)。不能用不同的二进制表示同一个数值。
5的补码00000101
-5的补码11111011
把两个二进制相加=100000000,8个位已经存不下了1跑到了第9位。但是一个字节占8位。要截取掉。得到00000000.所以结果得0
】
人只认识原码
一个字节占8位
一个整数占4字节,一个字符占1个字节。
原码最高位为符号位:0表示正数,1表示负数。非符号位为该数字绝对值的二进制。
5的二进制原码 00000101
-5的二进制原码 10000101
反码:
正数的 反码与源码一直
负数的反码是对源码按位取反,最高位的符号位不变。
5的反码:00000101
-5的反码:11111010
补码存在的意义是什么?(单片机读取传感器的数据是补码形式的)
正数的 补码与源码一直
负数的补码与该数的反码加1
5的补码:00000101
-5的补码:11111011
以上是正向转换
下面是反向转换,
举例1:单片机采集到了补码数据:00000101,最高位是0为可以知道是正数
那么正数的补码和源码一致。原码也是00000101 = 5;
那么如果是负数的补码:1000 0010
1000 0010变成反码,+1,高位不变 1000 0011这是反码
而1000 0011反码的源码 ,按位取反,高位不变 1111 1100 =
举例2:单片机采集到了补码数据:11111011,最高位是1为可以知道是负数
先得到反码,
反码=补码-1 -> 11111011-1=11111010
原码=反码按位置取反,符号位不变 -> 10000101 。最高位是1表示是负数。0101是5
最后结果为-5;