引例
数据在计算机中的表示?
数值、音频、文本、视频、图形图像
==但最终这些数据都是存在计算机的内存里,或者说存在外部存储器磁盘里。
?那么数据在内存中又是如何存储的呢?
我们可以看到,计算机上的arduino控制板中
,
地址信号引脚
(最基本单元)[又叫做一个位 bit
]
它只能读取高电压和低电压两种信号。
即【0】或【1】;
而引脚的存储容量非常小,故人们将八位设为一个存储单元(Byte
)
存储单元地址一个字节 | 位 bit |
---|---|
0000 | 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 |
0001 | 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 |
0002 | 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 |
0003 | 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 |
0004 | 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 |
0005 | 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 |
0006 | 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 |
0007 | 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 |
0008 | 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 |
所以说要看内存就看有多少个存储单元。
内存容量 | 常见换算 |
---|---|
1 Byte = 8 bit | 1 KB=2^10 Byte |
1 MB=2^10 KB | 1 GB=2^10 MB |
1 TB=2^10 GB |
文本数据表示-字符Char
128个字符,如何存储
-> 排序
从7个0开始排序标号 | 0 0 0 0 0 0 0 |
---|---|
0 0 0 0 0 0 0 | - > 1 1 1 1 1 1 1 |
这就是标准的ASCII码
全称:美国标准信息交换码
那么,一个最基本的存储单元是8位,多出来的最高位如何处理?
在最开始的处理方案中,最高位一律补0
如下
1 0 0 0 0 0 1 | 2 ^ 6 + 1 = 65 |
---|---|
1 1 1 1 1 1 1 | 2 ^ 7 - 1 =127(128个字符) |
扩展ASCII 码 | 2 ^ 8 - 1 =255(256个字符) |
国标码
国标码 GB2312=ASCII+常见汉字+符号;
国标码不一定是一个字节
编码长度 eg: log2(128)=7
数值型数据表示
—整型int
无符号整数
eg: 假设用2字节存储整数。
000000000 1001101 | 77 |
---|
无符号整数 | 各位均为数据位,按二进制存,可转换为十进制 |
---|---|
十进制整数转换为二进制 | 方法:除二取余倒排序 |
eg:77
十进制整数转换为二进制
77 除以 2 , 商 38 余 1
38 除以 2 , 商 19 余 0
19 除以 2 , 商 9 余 1
9 除以 2 , 商 4 余 1
4 除以 2 , 商 2 余 0
2 除以 2 , 商 1 余 0
1 除以 2 ,[商 0] 余 1
得出二进制串 ( 1 0 0 1 1 0 1 )--77
有符号整数 + -
有符号整数 | 最高位为符号位0/1,其余N-1位为数据位。 |
---|---|
三种编码方案 | eg:原码、反码、补码 |
– | – |
原码编码方案
2字节存储整数,最高位
表示符号。
如果是正数最高位添0;如果是负数,最高位添1
。
两个字节最高位为符号位
,其余15位表示数的数值。
+77 | 0 00000000 1001101 |
---|---|
-77 | 1 00000000 1001101 |
– | – |
反码编码方案
正整数反码 | 与原码,补码保持一致 |
---|---|
+77 | 0 00000000 1001101 |
负整数反码 | 原码基础上符号位不变,其余变反 |
---|---|
1 00000000 1001101 | 原码 -77 |
1 111111111 0110010 | 反码 -77 |
补码编码方案
正整数补码 | 与原码,反码保持一致 |
---|---|
+77 | 0 00000000 1001101 |
负整数补码 | 反码基础上加1,(即:绝对值逐位变反末位加1) |
---|---|
1 00000000 1001101 | 原码 -77 |
1 111111111 0110010 | 反码 -77 |
1 111111111 0110011 | 补码 -77 |
为什么要采用补码呢?
+0和-0的 | 原码 反码 补码 |
---|---|
+0 | 0 000 0000 0000 0000 |
-0 原码 | 1 000 0000 0000 0000 |
-0 反码 | 1 111 11111 1111 11111 |
-0 补码 | 0 000 0000 0000 0000 |
(使用原码反码对于0会产生错乱->使用补码
)
为什么(内部存储) | 机器内对有符号整数实际采用补码表示 |
---|---|
1 | 0表示法唯一。 |
2 | 减运算可以化为加运算。 |
—实数float/double
IEEE754:
规定了单精度浮点数和双精度浮点数
的两种实数的表示方法:
将真值转化为二进制数,并写成以2为基的科学计数法形式(+-1.M*2^e)
,之后分为符号位S、尾数M和指数e
三部分存储。
符号位 0正 1负;尾数部分因小数点前均为1,故只存放小数点后的纯小数部分(隐含1
);真值指数可正可负,为方便处理在原指数的基础上加上一正整数使其均非负(Excess码
)。
-6.5D -> -110.1B -> -1.101B*2^+2
分类 | 总位数 | 符号位S | 指数E(阶码) | 尾数M |
---|---|---|---|---|
单精度 | 32 | 最高位 | 次8位,真值指数e ∈[-126,127] ;阶码E=e+127 ∈[1,254] | |
双精度 | 64 | 最高位 | 次11位,真值指数e ∈[-1022,1023] ;阶码E=e+1023 ∈[1,2046] | |
特殊情况 | +0.0 | S=0/1 | E全0 | M全0 |
特殊情况 | 正无穷 | S=0/1 | E全1 | M全0 |
尾数M | 低端剩余部分各存储纯小数部分,隐含小数点前,这样能使精度更大,分别为:23+1/52+1 |
---|
以下部分参考C语言中文网内容,如有侵权,望告知
💕💕
内容也欢迎指正的啦!!!
小数在被存储到内存前,首先转换为下面的形式:
- > 1 . M × 2 ^ e
其中 M 为尾数,是二进制形式,且 1 ≤ M < 2;E 为指数,符号位S表示其正负。
举例:(32位float)对于 6.5,整数部分的二进制形式为:
6 = 1*4+1*2+0*1=110
小数部分的二进制形式为:
0.5 = 1×2^-1 = 1
将整数部分和小数部分合并在一起:
6.5 = 110.1
再将小数点向左移动2位:
110.1=1.101*2^+2
此时尾数为 101,指数为 2。
所有的小数被转换成指数形式后,尾数的整数部分都为1,
只把小数点后面的二进制放入内存中的尾数部分(23Bit)。
故对于 1.101,尾数部分是 101。