深入理解计算机系统(第三版)/ CSAPP 杂谈,第2章:信息的表示和处理
- gcc编译可以用 -std 和-ansi 来选择C语言规范版本,默认-std=c89,外加一些C99,C11特性
-
大小端可通过 int* 强转为 char* 来判断得出
-
一般C语言的 char 范围是-128~127,但其实C语言规范只要求最小的可取值范围为-127~127。类似还有 short,int,long,不过它们字节数要求是16位机器的要求。int32_t,int64_t C语言规范要求和C语言实现基本一致。#无用但有趣的冷知识
-
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)
这里没有简单地将INT_MIN赋值成-2147483647,是因为-2147483648对于编译器而言是个表达式,而2147483648对于32-bit整数是无法表示的 -
扩展数字:有符号转无符号,按bit解析;扩展字节,正数补0,负数补1
-
截断数字:无符号转有符号,按bit解析;压缩字节,保留符号位,其他直接截取
---- 2018.10.23 ----
- 补码乘法:将补码看作无符号正整数,相乘后截断结果,结果即为乘法结果。e.g.
(13 x -7) mod 2^8 = -91 = 10100101
-7 = 11111001b = 249(看作无符号)
(12 * 249) mod 2^8 = 165 = 10100101 = -91(看作补码)
- 浮点数基本都按照IEEE 754规范实现。1位用于表示正负,k位用于表示尾数,代表精度为1/2^k,n位表示阶码,代表绝对值取值范围为1 * 2^-(n-1) - 1, 2^(n-1)),分别是阶码取1和2^n-1时的值。尾数可任意取值时,绝对值范围为[1 * 2^-(n-1) - 1, 2 * 2^(n-1)))。阶码全0全1另有它用。具体看图2-36。
-
单精度浮点数符号位 1,尾数位23,阶数位8;双精度位1,52,11。所以单精度的精度为1/2^23,绝对值取值范围为[2^-126,2^127]。尾数默认第一位为1,这样可以不存储在bits中,从而提高一位精度。但也因此不能表示0(阶码全0可表示)。
-
阶码全0时可用于表示0,此时还会有+0.0和-0.0。阶码全1,尾数全0可表示正无穷和负无穷。尾数非全零表示NaN(Not a number)。
版权所有,转载请注明出处:
https://sickworm.com/?p=450