本节思维导图如下:
程序结构与存储(1)
一、定点数的表示与运算
进制的学习在计算机学习中是极为重要的,在嵌入式、硬件设计、电器自动化、电子电路甚至金融行业都有应用。十进制是是最常用的,满10进1的概念是一个基本的常识。所以十进制就说这么多。进制学习这块儿应该深入学习的是二进制。
1.1 进位计数与相互转换
(1)进位计数
(2)十进制转换其他进制
(3)二进制与其他进制的转换
(4)总结
1.常用数值
这里给出一般用的进制数值转换表:
十进制数值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
十六进制数值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
八进制数值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
二进制数值 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
十进制数值 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|
十六进制数值 | 8 | 9 | A | B | C | D | E | F |
八进制数值 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
二进制数值 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
除上表所示的值之外,我们对以下的值也应该敏感:
八位二进制的真值
八位二进制 | 1111 1111 | 十六位二进制 | 1111 1111 1111 1111 | 十五位二进制 | 0111 1111 1111 1111 |
---|---|---|---|---|---|
十进制 | 255 | 十进制 | 65535 | 十进制 | 32767 |
2. 各种进制前导符
二进制是Binary,很多地方我们也可以看到使用BIN简写
八进制是Octal,很多地方我们也可以看到使用OCT简写
十进制为Decimal,很多地方我们也可以看到使用DEC简写
十六进制为Hexadecimal,很多地方我们也可以看到使用HEX简写
在C语言中,需要使用前导符标识数值的进制,不指定的话一般默认十进制,具体,比如:
int a = 0b11; //表示二进制数11
几种进制的前导符如下:
进制 | 前导符 |
---|---|
二进制 | 0b或者0B |
八进制 | 0 |
十六进制 | 0x或者0X |
1.2 定点数的表示与运算
这里强调一下余数的定义,对于A mod B=C,结果C满足以下条件
C
=
A
−
⌊
A
/
B
⌋
B
C=A-\lfloor A/B\rfloor B
C=A−⌊A/B⌋B
通过这个式子能够计算负数对正数的余数(在许多编译器中求余并不是使用以上公式,但是也不影响同余地的操作)
例如:-2 mod 12=10,
1.2.3 定点数
定点数顾名思义其实就是小数点位置固定的数。计算机中有两种数据格式:定点数和浮点数。由于小数点位置固定不变,所以存储时小数点不进行存储,按照约定的位置计算数值。原则上说,小数点的位置可以位于任何位置,但通常将定点数表示成纯小数或纯整数,这样在硬件设计中更为实用。
为方便讨论数值范围,本文只讨论有符号数的一些性质,无符号数较为简单,读者可以根据有符号数的相关内容和自行得出。
(3)原码、反码、补码和移码,假设机器字长为n
- 反码总结:无论小数还是整数,反码的形式就是符号位标明正负,正数反码与原码相同,负数符号位不变,原码的数值位全部取反
之所以能够取以上形式,是由定义决定的。
对于n位字长的计算机,发生溢出时,情况如下:
最高位溢出时相当于增加一个
2
n
2^n
2n,为什么只能增加一个
2
n
2^n
2n呢,是因为最大的机器数相加如下:
1111…11(n个1)+1111…11(n个1)=1 1111…10(n+1个1),所以溢出时最高位只能进一位,相当于只能多一个
2
n
2^n
2n
这时再看之前举得例子对261 mod 255运算时相当于——(溢出位+机器数上的8位)mod 255 溢出位的值为
2
8
=
256
,
256
m
o
d
255
=
1
2^8=256,256\:mod\:255=1
28=256,256mod255=1,所以反码计算时,如果发生溢出需要对计算后的结果的最低位+1
小数与整数的设计方案相同,只不过小数的长度与整数不同罢了,读者可以自行推出相关结论。(这里就一万三千字了,重复的就不写了😚)
以8位机器字长为例,这里给出补码,移码对应表:
十进制 | 补码 | 移码 |
---|---|---|
-128 | 1000 0000 | 0000 0000 |
-127 | 1000 0001 | 0000 0001 |
-126 | 1000 0010 | 0000 0002 |
… | … | … |
-3 | 1111 1101 | 0111 1101 |
-2 | 1111 1110 | 0111 1110 |
-1 | 1111 1111 | 0111 1111 |
0 | 0000 0000 | 1000 0000 |
1 | 0000 0001 | 1000 0001 |
2 | 0000 0010 | 1000 0010 |
3 | 0000 0011 | 1000 0011 |
… | … | … |
125 | 1111 1101 | |
126 | 1111 1110 | |
127 | 0111 1111 | 1111 1111 |