深入理解计算机系统学习记录1
信息的表示和处理
学习《深入理解计算机系统》第二章,记录个人觉得重要的点
- 二进制,十进制,16进制之间的转换
按四位一组划分二进制可转换为16进制
转换表:
二进制 | 10进制 | 16进制 |
---|---|---|
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
十六进制数字0代表4个二进制0。所以,当n表示为i+4j的形式,其中0<=i<=3,我们可以把x写成开头的十六进制数字为
(i=0),2(i=1),4(i=2)或者8(i=3),后面跟随着j个十六进制的0。比如,x=2048=2^11,我们有n=11=3+4*2,从而得到0x800
.C语言格式化输出
%d,%c,%x,%u,%f,%.2x指针和数组
C语言中指针和数组可以互相表示C语言中字符串被编码成一个以null,值为0的字符结尾的字符数组。十进制数字x的ASCII码正好是0x3x,而终止字节的试卷进制为0x00.在使用ASCII码的任何系统上都将得到相同结果,与字节顺序和字大小无关,因此文本数据比二进制数据具有更强的平台独立性
utf-8表示将每个字符编码成一个字节序列,java编程语言使用Unicode来表示字符串
逻辑运算和位运算
逻辑运算:与&&,或||,非!
位运算:&,|,^
要分清区别:
按位运算只有在特殊情况下,也就是参数限制为0,1时才与其对应的逻辑运算有相同的行为,逻辑运算符&&,||与位级运算&,|之间重要的区别就是如果对第一个参数求值就能确定表达式的结果,那么逻辑运算就不会对第二个参数求值C语言中的移位运算
左移K位 << k: 丢弃最高的k位,并在右端补k个0
右移k位 >> k:
有两种形式:逻辑右移和算术右移
- 逻辑右移,补0
- 算术右移,补最高有效位的值,即1
而C语言对这点并没有明确规定
实际上所有的编译器/机器组合都对有符号数使用算术右移,且许多程序员也都假设机器会使用这种右移,另一方面,对于无符号数,右移是必须的。与c相比,java对于如何进行右移有明确的定义,逻辑右移:x>>>k,算术右移:x>>k
9. C/C++都支持有符号(默认)和无符号数,java只支持有符号数
10. 无符号编码,补码编码具有唯一性