第6节:数字的编码
假设我们有一个字节有8个位,8个位存储的数据是01010101,我问你这个数字存储是什么?大家现在考虑现在怎么回答。你首先会问存的是什么,我说里面存的是文本文件,那就按照文本文件来解析,我说是视频文件,那么就按照视频文件去解析。上一节讲解到无符号和有符号的第1位是0的时候怎么解析的,那我们回顾一下,我们假设是一个无符号数01010101,它的十六进制解析结果是55,如果要转换成十进制的话就是85。那么是有符号数的话,第1位是0的话,说明它是正数,因为正数和无符号数的解析方式是一样的。虽然你这个数现在是有符号数来解析,解析完后任然是55,这就是解析的结果。但是如果是11010101按照无符号数来解析你会吗?解析的结果是D5(0xD5),转成十进制是213。但是我告诉你这个是有符号数的话你该如何解析呢?我们需要了解一下概念和需要做那些铺垫。
有符号数的编码规则
概念是什么呢? 分为:1、原码 2、反码 3、补码
原码:最高位为符号位,其余各位为数值本身的绝对值
比如:1的原码如何来写,首先要决定数据的宽度,假设是一个字节(字节有8个位)
1的原码是0000 0001
反码:
正数:反码与原码相同
负数:符号位为1,其余位对原码取反
补码:
正数:补码与原码相同
负数:符号位为1,其余对原码取反加1
例子:
正数形式:
如果是正数是1的话,1就等于0000 0001
如果是正数是6的话,1就等于0000 0110
负数形式:
-1的原码是1000 0001
-1的反码是1111 1110
-1的补码是1111 1111 //FF
-7的原码是1000 0111
-7的反码是1111 1000
-7的补码是1111 1001 //F9
实验在内存中的存储的值:
int main()
{
char a =1;
printf("%x\n",&a)
return 0;
}
int main()
{
char a =-1;
printf("%x\n",&a)
return 0;
}
总结:
1、正数原码存储形式
2、负数补码存储形式
无符号范围:0~FF
有符号范围:
正数:0~7F
负数:FF~80