您的位置:首页 > 理论基础

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

2016-02-23 22:44 246 查看
《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<bits/stdc++.h>
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.

若位移量超过数据长度(一般不允许),很多机器会将位移量模除数据长度.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CSAPP