信息的表示
在遇到一些常见问题的时候总是遗忘基础的知识,故基于《CSAPP》的第二章“信息的表示和处理”,按照个人理解重新进行总结便于查询与复习。
数字表示
- 无符号unsigned编码
- 补码tow's-complement编码
- 浮点数floating-point编码
取值范围不对称 - 原码|反码|补码
- C语言标准并没有要求要用补码形式来表示有符号整数,但是几乎所有的机器都是这么做的。
有符号数与无符号数之间的转换
- B2U是一个双射:无符号数编码具有唯一性
- B2T是一个双射:补码编码具有唯一性
- 当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式地将有符号参数强制转换为无符号数。
定点数与浮点数 fixed-point & floating-point
数的表示
定点数与浮点数的”点“指的是小数点。
- 定点数:小数点的位置是固定的,取值范围较小。
- 浮点数:以指数形式存储数字,直观且节省内存的增大了数的范围。
浮点数舍入与误差
模式 | 舍入方式 |
---|---|
就近舍入 | 用最接近x的可表示的值来代替;如果x正好在两个相邻的可表示值的中间, 则首选二进制最后一位为0 |
向下舍入 | 用不大于x的可表示的值来代替 (向负无穷大方向截断) |
向上舍入 | 用不小于x的可表示的值来代替 (向正无穷大方向截断) |
向0舍入 | 当x>0时采用向下舍入,当x<0时采用向上舍入 |
由于计算机无法精确表示所有的浮点数,在做浮点运算时,如果计算结果无法精确表示,此时就会产生的误差,这就是浮点运算的舍入误差。
溢出 overflow
用有限数量的位来对一个数字编码,当结果太大以至不能表示时,某些运算就会溢出。
有符号整数
上溢
int x = INT_MAX;
cout << x << '\n'; // 2147483647
++x;
cout << x << '\n'; // -2147483648
下溢
int x = INT_MIN;
cout << x << '\n'; // -2147483648
--x;
cout << x << '\n'; // 2147483647
无符号整数
unsigned int ux = UINT_MAX;
cout << ux << '\n'; // 4294967295
++ux;
cout << ux << '\n'; // 0
ux = 0;
--ux;
cout << ux << '\n'; // 4294967295