csapp第二章总结

目录

2.1信息存储

1、程序类型

2、字节序

3、C语言中位运算

4、C语言中逻辑运算

5、C语言中的移位运算

2.2整数表示

1、无符号数编码

2、补码编码

3、补码转为无符号数

 4、无符号数转补码

 5、有符号数数与无符号数的运算

6、拓展数字位表示 

 7、截断数字

2.3整数运算

1、加法

2、求反

3、乘法

4、乘以常数

 5、除以2的幂

2.4浮点数

1、二进制小数

2、IEEE浮点表示

3、舍入

4、浮点运算

 5、C语言中浮点类型转换


2.1信息存储

1、程序类型

我们将程序称为“32位程序”或“64位程序时”,区别在于该程序是如何编译的,而不是其运行的机器类型。

Linux > gcc -m32 prog.c  // 32位程序 可以在32位或者64位程序上运行
Linux > gcc -m64 prog.c  // 64位程序 只能64位程序上运行

 数据类型 int32_t 和 int64_t 分别为4个字节和8个字节。不随编译器和机器设置变化。

2、字节序

 网络应用程序的代码编写必须遵守已建立的关于字节顺序的规划,以确保发送方机器将它的内部表示转换成网络标准,而接收方机器则将网络标准转换为它的内部表示。

文本数据是比二进制数据具有更强的平台独立性。二进制是经过编译得到的。不同机器、编译器可能具有不同编译规则。因此二进制代码是不兼容的,很少能在不同机器和操作系统之间移植。

3、C语言中位运算

|(或)  &(与)  ~(非)

4、C语言中逻辑运算

逻辑运算认为所有非零的参数都表示TRUE,而参数0表示False。

逻辑运算符&&和||与他们对应的位级运算&和|的另一个重要区别是,逻辑运算符如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值(意味着提前结束)。例如表达式 a&&5/a 将不会造成被零除,表达式 p&&*p++也不会导致间接引用空指针。

5、C语言中的移位运算

左移运算:对于一个位表示为的操作数 x,x << k 会生成一个指,其位表达式为也就是说将x右边的w-k位向左移动k位,丢弃最高的k位,并在右端补k个0.

例如:操作数 x 位表达式为 01010101,x << 3 将得到 10101000。

右移运算:所有的左移操作都是一样的,然而右移运算 x >> k 分为逻辑右移和算术右移。逻辑右移与左移相似,在左端补 k 个0,得到的结果是。而算术右移是在左端补k个操作数 x 最高有效位的值,得到的结果是 

例如:操作数 x 位表达式为 00110101, x >> 3(逻辑右移) 将得到 00000110。

           操作数 x 位表达式为 00110101, x >> 3(算术右移) 将得到 00000110。

           操作数 x 位表达式为 00110101, x >> 3(算术右移) 将得到 111001110。

几乎所有的编译器/机器组合都对有符号数使用算术右移。而对于无符号数右移必须是逻辑的。

下面再给出一个例子:

 

 其中斜体的数字表示最右端(左移)或最左端(右移)填充的值。

2.2整数表示

1、无符号数编码

 数值范围 0 ~ 2^{w}-1。介于0 ~ 2^{w}-1之间的数都有唯一一个w位的值编码。w位无符号值范围为0~UMax_{w}。其中UMax_{w}=2^{w}-1

2、补码编码

 最高有效位 x_{w-1}也称为符号位,它的权重为-2^{w-1},是无符号表示中权重的负数。

w位补码能表示的值的范围为TMin_{w}~TMax_{w}。其中 TMin_{w}=-2^{w-1}TMax_{w}=2^{w-1}-1

可以看出补码的值范围是不对称的:|TMin|=|TMax|+1

最大无符号数值刚好比补码最大值的两倍大一:UMax_{w}=2TMax_{w}+1

3、补码转为无符号数

 4、无符号数转补码

 5、有符号数数与无符号数的运算

要创建一个无符号常量,必须加上后缀字符‘U’或‘u’,例如12345U或者0x1A2Bu。

由于C语言同时包含有符号和无符号表达式,出现了一些奇特的行为。当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式的将有符号参数强制转换为无符号数。因此对于像<和>这样的关系运算符来说,会导致非直观的结果。

6、拓展数字位表示 

无符号拓展位在前面添加0 ,有符号拓展位在前面添加最高有效位的值。

 7、截断数字

截断无符号数

 截断补码数值

2.3整数运算

1、加法

无符号加法

补码加法

2、求反

无符号数求反

补码的非

 执行补码非的另一种方式是对每一位求补,再对结果加1。-x=~x+1

3、乘法

无符号乘法

 补码乘法

 无符号和补码乘法具有位级等价性

 相同的位向量表示的数相乘,无论是无符号还是补码形式,得到的结果截断后位级表示都相同。

4、乘以常数

在大多数机器上,由于乘法指令比较慢,需要更多的时钟周期。编译器会进行一项优化,试者用移位和加法运算的组合来代替乘以常数因子的乘法。例如 x*14 编译器会将乘法重写为 (x<<3)+(x<<2)+(x<<1)。

 5、除以2的幂

整数除法比整数乘法更慢。除以2的幂也可以用移位运算来实现。无符号和补码数分别使用逻辑移位和算术移位来达到目的。

2.4浮点数

1、二进制小数

例如101.11_{2}=1*2^{2}+0*2^{1}+1*2^{0}+1*2^{-1}+1*2^{-2}=4+0+1+\frac{1}{2}+\frac{1}{4}=5\tfrac{3}{4}

二进制小数只能表示那些能够写出x*2^{y}的数,其他的值只能被近似的表示,增加二进制长度可以提高表示的精度。

2、IEEE浮点表示

 C语言中浮点数包括单精度和双精度,分别用32位和64位表示。

 根据exp的值,被编码的值分为三种不同的情况:非规格化值、规格化值、特殊值。

规格化值:exp不全为0 也不全为1。

非规格化值:exp全为0

特殊值:exp全为1 

假定8位浮点格式的示例

3、舍入

4、浮点运算

浮点运算不满足结合律和分配律

 5、C语言中浮点类型转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值