《深入理解计算机系统》学习笔记(一):信息的表示和处理

《CSAPP》是学习计算机不可多得的一本好书,对比一年前学的计算机组成原理,很多晦涩复杂的知识,现在终于有了些许理解,借博客记录以自用。

信息存储

  • 十六进制表示法:hex,oct,dec,bin之间的转换是基本功,唯手熟尔,这里就不予赘述了。

  • 字(word):每台计算机都有一个字长,指明长整数和指针的大小,所以一台计算机的 word size = long / pointer size,例如32位机的char*大小为4字节,64位为8字节;32位机long int的大小和int一致,64位机long int大小为int 两倍(但是64位机long long int = long int)

  • 寻址与字节顺序:大端法与小端法的区别(最高有效字节在最前面即低地址的为大端法,主要用于IBM与Sun机器;最低有效字节在最前面的为小端法,主要用于Intel及其兼容机),查看不同程序对象的字节表示可以使用如下代码:

#include
using namespace std;

typedef char *byte_pointer;

void show_bytes(byte_pointer start, int len) 
{
    for (int i = 0; i < len; i++)
        printf(" %.2x", start[i]);
    printf("\n");
}
//利用强制类型转换
void show_int(int x)
{
    show_bytes((byte_pointer) &x, sizeof(int));
}
void show_float(float x)
{
    show_bytes((byte_pointer) &x, sizeof(float));
}
void show_pointer(void *x)
{
    show_bytes((byte_pointer) &x, sizeof(void *));
}
void show_unsigned(unsigned x)
{
    show_bytes((byte_pointer) &x, sizeof(unsigned));
}

...

*注意如下代码

const char *s = "abcdef";
show_bytes((byte_pointer) s, strlen(s));

打印结果为61 62 63 64 65 66

C语言中的位运算

  • 位级运算(|、&、^、~):基于长度为2的位向量上的布尔代数运算。

  • 位级运算的经典应用:

    • 不使用中间变量而交换两个变量的值:
    void inplace(int *x, int *y)
    {
        *y = *x ^ *y;
        *x = *x ^ *y;
        *y = *x ^ *y;
    }
    • 掩码运算(见练习2.12, 2.13)
  • 逻辑运算(||、&&、!):所有非0参数均为True,反之则为False

  • 逻辑运算的一些知识:

    • x == y 等价于 !(x ^ y)
    • 命题优先级问题:如果对第一个命题求值就能确定表达式结果,那么逻辑运算符就不会再对第二个命题求值(例如:a && 5/a 不会被零除, p && *p++也不会导致间接引用空指针)
  • 移位运算(>>,<<):从左至右,符合结合律

  • 移位运算的几个要点:

    • 右移运算分为算术右移和逻辑右移,有符号数据使用算术右移,即往最左端填充操作数最高位(即符号位);无符号数据使用逻辑,即填充0.
    • 若位移量超过数据长度(一般不允许),很多机器会将位移量模除数据长度.

你可能感兴趣的:(《深入理解计算机系统》学习笔记(一):信息的表示和处理)