嵌入式系统(3)数的系统
核心是数的进制及其转换(在数电里应该都学的差不多了)以及数在计算机系统里的存储。
数的表示
数字(用来表示数 作为一种符号)和数(有大小 数值意义)
数的值和数的表示(二进制,十进制,十六进制)
不同进制的数的转化
数在计算机内部的表示
机器数:一个数连同它的符号都用二进制的编码形式来表示,这种数称为机器数。
真值:一个机器数对应的十进制数值称为这个机器数的真值
无符号数
计算机中表示一个数其长度一般是受限且固定的。n位无符号数的范围:0
≤
\leq
≤ x
≤
2
n
\leq2^n
≤2n
算数运算:加减乘除。乘以2相当于左移一位,除以二相当于右移一位。
逻辑运算:与或非。按位运算
有符号数
原码:最高位为符号位,占用一个bit。 习惯上0表示正数,1表示负数
n位有符号数原码的表示范围是
−
(
2
n
−
1
−
1
)
∼
+
(
2
n
−
1
−
1
)
-(2^{n-1}-1)\sim+(2^{n-1}-1)
−(2n−1−1)∼+(2n−1−1)
0 的原码不唯一既可以是0 0000000也可以是1 0000000
反码:正数不变。负数符号位不变数值部分按位求反。反码的表示范围与原码相同。0 的反码仍然不唯一。
补码:正数不变,负数为反码+1。表示范围为
−
2
n
−
1
∼
+
(
2
n
−
1
−
1
)
-2^{n-1}\sim+(2^{n-1}-1)
−2n−1∼+(2n−1−1)即最小负数没有反码
在补码体系中,0 的表示变成唯一的,于是可以多表示一个数
−
2
n
−
1
-2^{n-1}
−2n−1.
特殊数:1000 0000
在原码中定义为-0,反码中定义为-127,在补码中定义为-128
对于无符号数:128
补码的引进使得加减法统一为加法
[X+Y]补=[X]补+[Y]补
[X-Y]补=[X]补-[Y]补=[X]补+[-Y]补
模
同模数:X+
k
∗
2
n
k*2^n
k∗2n
类比钟表:某一个时刻,再过12h或24h或36h指针都指向同一个地方。
对8位存储来说,模就是256。用8bit存储补码的时候模为256,但原码反码不具备这个有点,因为它们的编码设计中0不唯一,破坏了这一点。
补码的本质:正的同模数
一个附属的二进制补码表示本质上是这个负数的一个正的同模数(无符号二进制)。比如-128 补码表示为1000 0000 。-128+256=128 其二进制(无符号)表示恰为1000 0000。
补码用于计算的原理
当数字位数有限的时候,超出位数的高位借位和进位无法表示,其实相当于可以随便向高位借位和进位而不被表示出来。所以负数在加减运算中可以用其同模数也就是补码参与。
数A+数B=数A+数B的同模数(相当于向高位借位了)mod模(相当于向高位进位)。无论正负数都可以这么算,于是在补码中加减被统一成了加法。
符号数计算中的溢出问题
绝对值会变大的计算可能产生溢出,同号相减或异号相加,绝对值越算越小,不会溢出。同号相加和异号相减可能产生溢出
判断:符号位参与运算产生的进位与最高有效为产生的进位不同的时候发生了溢出。
举例:两个正数相加符号位进位为0 若最高有效位相加产生了进位则溢出。
若为两个负数相加,符号位进位必为1,若最高有效位相加无进位则结果表示的是一个正数,显然产生了溢出。
浮点数
N
=
(
−
1
)
s
M
∗
R
J
N=(-1)^sM*R^J
N=(−1)sM∗RJ
N:
S:正负符号
R:基数(=2) J:阶码
M:尾数
IEEE规定
单精度(32位):1位阶码符号 7位阶码数值 1位尾数符号 23位尾数数值
例如0.0001010001B=0.1010001B*2^(-3)
[-3]补=2^8-3=253=1 111 1101
浮点数形式:1 1111101 0 10100010000000000000000
(浮点数存储格式理解即可,具体的存储规范可查看https://blog.csdn.net/AaricYang/article/details/91358149.)
计算机中的储存单位
1Mb=
2
20
2^{20}
220bit
1Gb=
2
30
2^{30}
230bit=1024Mb
1Tb=
2
40
2^{40}
240bit=1024Gb
1 Byte =8 bit
1KB=1024 Byte
Word 表示字长,历史上有4bit 8bit 32bit 64bit 等多种标准。一般原则上定义为计算机能够一次性处理的数据长度,与总线宽度、CPU内部寄存器宽度等都有关系。一般是字长=CPU数据寄存器宽度=计算机系统总线宽度。
Windows中 字长一般为2B(16位)DWORD=4B,QWORD=8B