深入理解计算机系统学习记录1

信息的表示和处理

学习《深入理解计算机系统》第二章,记录个人觉得重要的点

  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

  1. .C语言格式化输出

    %d,%c,%x,%u,%f,%.2x

  2. 指针和数组

    C语言中指针和数组可以互相表示

  3. C语言中字符串被编码成一个以null,值为0的字符结尾的字符数组。十进制数字x的ASCII码正好是0x3x,而终止字节的试卷进制为0x00.在使用ASCII码的任何系统上都将得到相同结果,与字节顺序和字大小无关,因此文本数据比二进制数据具有更强的平台独立性

  4. utf-8表示将每个字符编码成一个字节序列,java编程语言使用Unicode来表示字符串

  5. 逻辑运算和位运算

    逻辑运算:与&&,或||,非!

    位运算:&,|,^

    要分清区别:

    按位运算只有在特殊情况下,也就是参数限制为0,1时才与其对应的逻辑运算有相同的行为,逻辑运算符&&,||与位级运算&,|之间重要的区别就是如果对第一个参数求值就能确定表达式的结果,那么逻辑运算就不会对第二个参数求值

  6. C语言中的移位运算

  7. 左移K位 << k: 丢弃最高的k位,并在右端补k个0

    右移k位 >> k:

    有两种形式:逻辑右移和算术右移

  • 逻辑右移,补0
  • 算术右移,补最高有效位的值,即1

而C语言对这点并没有明确规定

实际上所有的编译器/机器组合都对有符号数使用算术右移,且许多程序员也都假设机器会使用这种右移,另一方面,对于无符号数,右移是必须的。与c相比,java对于如何进行右移有明确的定义,逻辑右移:x>>>k,算术右移:x>>k

9. C/C++都支持有符号(默认)和无符号数,java只支持有符号数

10. 无符号编码,补码编码具有唯一性


深入理解计算机系统学习记录1
https://shanhainanhua.github.io/2019/09/26/深入理解计算机系统学习记录1/
作者
wantong
发布于
2019年9月26日
许可协议