https://www.zhihu.com/people/jiu_sheng
https://blog.csdn.net/qianshang52013/article/details/138140235?spm=1001.2014.3001.5501
Autosar 系列教程:小柴带你学 AutoSar 总目录
# 小柴冲刺软考中级嵌入式系统设计师系列一、计算机系统基础知识(2)数据表示
二进制是计算机系统广泛采用的一种数制。在计算机内部,数值、文字、声音、图形图像等各种信息都必须经过数字化编码后才能被发送、存储和处理。
# 一、进位计数制及转换
进位制 | 二进制 | 八进制 | 十进制 | 十六进制 |
---|---|---|---|---|
规则 | 逢二进一 | 逢八进一 | 逢十进一 | 逢十六进一 |
基数 | r=2 | r=8 | r=10 | r=16 |
数符 | 0,1 | 0,1,2,3,4,<br />5,6,7 | 0,1,2,3,4,<br />5,6,7,8,9 | 0,1,2,3,4,<br />5,6,7,8,9,<br />A,B,C,D,E,F |
权 | 2^i | 8^i | 10^i | 16^i |
形式表示符 | B | O | D | H |
将十进制转换为二进制
175.71875(10)= 2^7 + 2^5 + 2^3 + 2^2 + 2^1 + 2^0 +2^-1 + 2^-3 + 2^-4 +2^-5 = 10101111.10111(2)
这里举个例子:
假设要将十进制数 13 转换为二进制数:
13 ÷ 2 = 6 余 1 | |
6 ÷ 2 = 3 余 0 | |
3 ÷ 2 = 1 余 1 | |
1 ÷ 2 = 0 余 1 |
将余数逆序排列得到:1101。因此,十进制数 13 转换为二进制数为 1101。
之前我一直不理解为什么要这样除 2。现在跟大家解惑一下
证明:
因为 13(10 进制)= 1101(二进制)
所以 13 ➗ 2 = 6 余 1 就可以看作为 1101 >> 1 余 1 (二进制 / 2 就是右移一位)
所以
十进制 | 结果 | 余数 | 二进制 | 结果 | 余数 |
---|---|---|---|---|---|
13 / 2 | 6 | 1 | 1101>>1 | 110 | 1 |
6/2 | 3 | 0 | 110>>1 | 11 | 0 |
3/2 | 1 | 1 | 11>>1 | 1 | 1 |
1/2 | 0 | 1 | 1>>1 | 0 | 1 |
所以倒推二进制计算结果,每次➗2 的余数都是在计算最低位的数值。
所以通过 10 进制 / 2 的余数即可转换为二进制。
同理:八进制是不是也一样呢。
这里就不展开了。
# 二、数值型数据的表示
# 1、原码、反码、补码和移码
数据在计算机中表示的形式成为机器数,采用二进制计数。
那为了便于计算呢就出现了原码、反码、补码和移码等不同的编码。
这里可以看我之前的文章有详细的原理介绍。
文章在这呢:一篇文章彻底理解原码反码和补码
# 2、定点数和浮点数
定点数:表示数据时小数点位置固定。
浮点数:小数点位置不固定。
浮点数一般表示为: | |
N = 2^E * F | |
E:阶码 | |
F:尾数 | |
-------------------------- | |
| 阶符 | 阶码 | 数符 | 尾数 | | |
-------------------------- |
工业标准 IEEE 754
-------------------------- | |
| S | P | M | | |
-------------------------- | |
S:符号位【0正1负】 | |
P:指数(阶码)【用移,码表示】 | |
M:尾数【用原码表示】 |
# 3、其他数据表示
任何字符在计算机中都要转为二进制
- 8421 码
- ASCII 码
- 汉字编码
- Unicode
# 4、校验码
为了防止数据出错,在数据中添加校验码来检查数据正确性。
# ①奇偶校验码
在数据中添加一个 0/1 来使得数据中 1 的个数为奇数(奇校验)或者偶数(偶校验)。
十进制 | 8421BCD 码 | 带奇校验的 8421 码 | 带偶校验的 8421 码 |
---|---|---|---|
0 | 0 0 0 0 | 0 0 0 0 1 | 0 0 0 0 0 |
当然啦也存在三种:水平奇偶校验码 和 垂直奇偶校验码 以及 水平垂直奇偶校验码。
# ②海明码
n: 数据位、k: 校验位
2^k - 1 >= n + k
# 确定位置
假设有一个 8 位的数据那海明码的组成为 24-1>=8+4 (所以 k 为 4)(所在的位置为 2 (i-1) 即为 (1 2 4 8))
h12 | h11 | h10 | h9 | h8 | h7 | h6 | h5 | h4 | h3 | h2 | h1 |
---|---|---|---|---|---|---|---|---|---|---|---|
D7 | D6 | D5 | D4 | P4 | D3 | D2 | D1 | P3 | D0 | P2 | P1 |
# 海明码的校验关系
海明码 | 海明码下标 | 校验位组 | 说明(偶校验) |
---|---|---|---|
H1(P1) | 1 | P1 | P1 校验:P1,D0,D1,D3,D4,D6<br /> 即 P1=D0⊕D1⊕D3⊕D4⊕D6 |
H2(P2) | 2 | P2 | P2 校验:P2,D0,D2,D3,D5,D6<br /> 即 P2=D0⊕D2⊕D3⊕D5⊕D6 |
H3(D0) | 3=1+2 | P1,P2 | |
H4(P3) | 4 | P3 | P3 校验:P3,D1,D2,D3,D7<br /> 即 P3=D1⊕D2⊕D3⊕D7 |
H5(D1) | 5=1+4 | P1,P3 | |
H6(D2) | 6=2+4 | P2,P3 | |
H7(D3) | 7=1+2+4 | P1,P2,P3 | |
H8(P4) | 8 | P4 | P4 校验:P4,D4,D5,D6,D7<br /> 即 P4=D4⊕D5⊕D6⊕D7 |
H9(D4) | 9=1+8 | P1,P4 | |
H10(D5) | 10=2+8 | P2,P4 | |
H11(D6) | 11=1+2+8 | P1,P2,P4 | |
H12(D7) | 12=4+8 | P3,P4 |
# 检测错误
G1=P1⊕D0⊕D1⊕D3⊕D4⊕D6 |
---|
G2=P2⊕D0⊕D2⊕D3⊕D5⊕D6 |
G3=P3⊕D1⊕D2⊕D3⊕D7 |
G4=P4⊕D4⊕D5⊕D6⊕D7 |
若采用偶校验,则 G4G3G2G1 全为 0 时表示数据无错误(奇校验应全为 1)
若 G4G3G2G1 = 1010 则说明 H10 (D5) 出错了,将其取反即可纠正错误。
# ③循环冗余校验码
循环冗余校验码(Cyclic Redundancy Check, CRC)是一种用于检测数据传输或存储过程中错误的校验码。CRC 是一种基于多项式除法的算法,通过在数据传输前附加一个校验码来确保数据的完整性。以下是 CRC 的一些关键点:
基本原理:CRC 基于二进制多项式的数学运算。发送方在原始数据后附加一个校验码,使得附加数据(原始数据 + 校验码)可以被一个预定的生成多项式整除。在接收方,数据通过相同的生成多项式进行检查,如果余数为零,则说明数据没有错误。
生成多项式:这是一个预定的多项式,用于生成和校验 CRC 码。例如,CRC-32 使用的生成多项式是 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
计算步骤:
- 发送方:
- 将数据视为一个二进制多项式。
- 将数据多项式左移(在其后附加零位),零位的数量等于生成多项式的度数。
- 使用二进制除法将移位后的数据多项式除以生成多项式,得到余数。
- 将余数附加到原始数据后,形成发送的数据帧。
- 接收方:
- 接收数据帧,视为一个多项式。
- 使用相同的生成多项式对接收的数据帧进行二进制除法,得到余数。
- 如果余数为零,说明数据没有错误;否则,数据可能存在错误。
优势:
- 高效:CRC 算法计算速度快,适合硬件实现。
- 检测能力强:能够检测出常见的传输错误,如单个比特错误、双比特错误、奇数个比特错误以及突发错误。
应用场景:CRC 广泛应用于数据通信、存储设备、网络协议等领域,如以太网、USB、HDLC 等协议中都使用了 CRC 来确保数据的完整性。