以下内容参考自data whale 组队学习
信息的存储
序将内存视为一个非常大的数组:由字节(1字节=8比特)组成。每个字节用一个唯一数字表示,就称为地址。
地址的集合:虚拟地址空间。
字长:决定虚拟地址空间的最大可以到多少(2^w-1)(我们常听的64/32位机器)
64位机器向32位机器兼容:改变编译选项:gcc -m32 -o hello32 hello.c。这个程序可以运行在64与32位的机器上。
对于数字存储,有大端法(高位在前,与手写习惯一致),小端法(低位在前)之别(不同系统的机器可能不一样)。而文本由ascii码表示,具有更强的平台独立性。
有符号位的二进制表示
三种表示方法:
* 原码:正数的符号位用“0”表示,负数的符号位用“1”表示,其余数位表示数值本身(优点:简单、人易懂。缺点:加减法麻烦);
* 反码:正数的反码与其原码相同; 负数的反码是在原码的基础上保持符号位不变,其余
各位按位求反得到的。
* 补码:正数的补码与其原码相同; 负数的补码是在原码的基础上保持符号位不变,其它的数位 1 变为 0,0 变为 1,最后再加 1 运算。也就是说,负数的补码是它的反码加 1(通常使用)。
注意:任意数的补码的补码是原码。
补码的理解:负数+绝对值相等的正数归0.由于最高位的存在(负数为1,加不成0),归0使用溢出的方法实现,也就是说,负数+绝对值相等的正数=11111111.由此可以认为认为负数的补码是反码+1.实现归0.
有符号数和无符号数的转换
* 有符号转无符号:得到的无符号数等于该有符号数加上 2^w(负数成大数);
* 无符号转有符号:当最高位等于 0 时,无符号数可以表示的数值小于有符号数的最大值,此时转换后的数值不变。当最高位等于 1时,无符号数可以表示的数值大于有符号数的最大值,在这种情况下,转换后得到有符号数等于该无符号数减去 2^w(负数)
扩展与截断
扩展:当有符号数从一个较小的数据类型转换成较大类型时,进行符号位扩展,可以保持数值不变。
需要注意的是:正数补0,负数补1.
截断:保留低位
整数运算
加法:
1. 无符号相加注意溢出,高位截断保留低位。
2. 有符号相加:当 x 加 y 的和大于等于 2^w−1 时,发生正溢出,此时,得到的结果会减去 2^w. 当 x 加 y 的和小于 −2^w−1 时,发生负溢出,此时,得到的结果会加上 2^w
乘法:
1. 无符号相乘注意溢出,高位截断保留低位。
2. 有符号相乘:计算机的有符号数用补码表示,因此补码乘法就是有符号数乘法。无论是无符号数 乘法,还是补码乘法,运算结果的位级表示都是一样的,只不过补码乘法比无符号 数乘法多一步,需要将无符号数转换成补码(有符号数)。虽然完整的乘积结果的位 级表示可能会不同,但是截断后的位级表示都是相同的。
case:负数补码,符号位不变,左移补0,右移补1.
浮点数计算
表示:符号位,阶数位,尾数位/底数位(科学计数法相关)。
* 单精度(共32位表示):其中最高位 31 位表示符号位 s。从第 23 位到 30 位,这 8 个二进制位表示阶数。剩余的 23 位表示尾数 M 。
* 双精度(共64位表示):其中最高位 63 位表示符号位 s。中间11位表示阶数。剩余的 52 位表示尾数 M 。
+/- inf 位阶无穷
舍入方式:向偶舍入、向零舍入、向下 舍入、向上舍入。
由于表示问题,带来京都问题,从而使得加法、乘法结合性、分配性不满足。