《深入理解计算机系统》学习笔记(一):信息的表示和处理
2016-02-23 22:44
246 查看
《CSAPP》是学习计算机不可多得的一本好书,对比一年前学的计算机组成原理,很多晦涩复杂的知识,现在终于有了些许理解,借博客记录以自用。
字(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及其兼容机),查看不同程序对象的字节表示可以使用如下代码:
*注意如下代码
打印结果为61 62 63 64 65 66
位级运算的经典应用:
不使用中间变量而交换两个变量的值:
掩码运算(见练习2.12, 2.13)
逻辑运算(||、&&、!):所有非0参数均为True,反之则为False
逻辑运算的一些知识:
x == y 等价于 !(x ^ y)
命题优先级问题:如果对第一个命题求值就能确定表达式结果,那么逻辑运算符就不会再对第二个命题求值(例如:a && 5/a 不会被零除, p && *p++也不会导致间接引用空指针)
移位运算(>>,<<):从左至右,符合结合律
移位运算的几个要点:
右移运算分为算术右移和逻辑右移,有符号数据使用算术右移,即往最左端填充操作数最高位(即符号位);无符号数据使用逻辑,即填充0.
若位移量超过数据长度(一般不允许),很多机器会将位移量模除数据长度.
信息存储
十六进制表示法: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 Chapter2 Representing and Manipulating Information node1
- CSAPP Chapter3 node2
- CSAPP DATA LAB1————位运算
- 阅读IEEE754关于浮点运算笔记
- CSAPP阅读笔记——第二章:信息的表示和处理
- CSAPP lab binary bomb 二进制炸弹
- Chap 2 Representing and Manipulating Information (CS:APP)
- CSAPP 实验一lab1 fitsBits
- csapp bomb lab:csapp lab2 炸弹实验
- CSAPP——实验一 位运算
- CSAPP——实验二 拆炸弹
- CSAPP——实验三 内存攻击(一)
- CSAPP——实验三 内存攻击(二)
- CSAPP之一:程序生命周期漫谈
- CSAPP中一个有意思的小东西
- SJTU->SE->ICS->LAB6 Malloc
- SJTU->SE->ICS->LAB8 Performance
- SJTU->SE->ICS->LAB9 Tiny Shell
- SJTU->SE->ICS->LAB1 Data