深入理解计算机系统(第三版)第二章重要内容摘要 第二章
2.1.3寻址和字节顺序
#include <stdio.h> typedef unsigned char *byte_pointer; void show_bytes(byte_pointer start,size_t len){ size_t i; for(i=0;i<len;++i) printf("%.2x",start[i]); printf(" "); } 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_point(void* x){ show_bytes((byte_pointer)&x,sizeof(void*)); } void test_show_bytes(int val){ int ival=val; float fval=(float)val; int *pval=&ival; show_int(ival); show_float(fval); show_point(pval); } int main(){ int i=12345; test_show_bytes(i); return 0; }
2.2.3补码编码
有符号数的三种表示方法
补码:
反码:
原码:
2.3.3补码的非
2.3.7除以2的幂
2.4.2 IEEE浮点表示
值1.0的位表示的阶码字段除了最高有效位为0之外,其它位都等于1。它的尾数值M=1,而它的阶码值E=$2^{k-1}-2^{k-1}$=0
2.4.4舍入
2.4.5浮点运算
浮点加法不具有结合性
浮点乘法不具有结合性和分配性
2.4.6C语言中的浮点数
第一章课后练习
1.1
A 加速比$S=T_{old}/T_{new}=frac{1}{(1-a)+frac{a}{k}}=frac{1}{(1-0.6)+frac{0.6)}{1.5)}}=1.25$
B $S=T_{old}/T_{new}=frac{1}{(1-a)+frac{a}{k}}$可推出$1.67=frac{1}{(1-0.6)+frac{0.6}{k}} approx3$即3*100=300公里每小时
1.2
$2=frac{1}{(1-0.8)+frac{0.8}{k}} approx2.66$
第二章课后练习
练习2.1
A $0x39A7F8 ightarrow001110011010011111111000$
B $1100100101111011 ightarrow0xC97B$
C $0xD5E4C ightarrow11010101111000101100$
D $1001101110011110110101 ightarrow0x26E7B5$
练习2.2
n | $2^n(十进制)$ | $2^n(十六进制)$ |
9 | 512 | 0x200 |
19 | 524288 | 0x80000 |
14 | 16384 | 0x4000 |
16 | 65536 | 0x10000 |
17 | 131072 | 0x20000 |
5 | 32 | 0x20 |
7 | 128 | 0x80 |
练习2.3
十进制 | 二进制 | 十六进制 |
0 | 00000000 | 0x00 |
167 | 10100111 | 0xA7 |
62 | 00111110 | 0x3E |
188 | 10111100 | 0xBC |
55 | 00110111 | 0x37 |
136 | 10001000 | 0x88 |
243 | 11110011 | 0xF3 |
82 | 01010010 | 0x52 |
172 | 10101100 | 0xAC |
247 | 11100111 | 0xE7 |
练习2.4
A 0x503c+0x8=0x5044
B 0x503c-0x40=0x4ffc
C 0x503c+64=0x503c+0x40=0x507c
D 0x50ea-0x503c=0x50bd
练习2.5
int main(){ int i=0x87654321; byte_pointer valp=(byte_pointer)&i; show_bytes(valp,2); return 0; }
A
小端法:21
大端法:87
B
小端法:2143
大端法:8765
C
小端法:214365
大端法:876543
练习2.6
A
$0x00359141 ightarrow001101011001000101000001$
$0x4A564504 ightarrow01001010010101100100010100000100$
B
001101011001000101000001
01001010010101100100010100000100
总共有21位匹配
C
串的头尾不匹配
练习2.7
int main(){ const char *s="abcdef"; show_bytes((byte_pointer)s,strlen(s)); return 0; }
616263646566
练习2.8
运算 | 结果 |
a | [01101001] |
b | [01010101] |
~a | [10010110] |
~b | [10101010] |
a&b | [01000001] |
a|b | [01111101] |
a^b | [00111100] |
练习2.9
R | G | B | 颜色 | 补集 |
0 | 0 | 0 | 黑色 | 白色 |
0 | 0 | 1 | 蓝色 | 黄色 |
0 | 1 | 0 | 绿色 | 红紫色 |
0 | 1 | 1 | 蓝绿色 | 红色 |
1 | 0 | 0 | 红色 | 蓝绿色 |
1 | 0 | 1 | 红紫色 | 绿色 |
1 | 1 | 0 | 黄色 | 蓝色 |
1 | 1 | 1 | 白色 | 黑色 |
蓝色|绿色=蓝绿色
黄色&蓝绿色=绿色
红色^红紫色=蓝色
练习2.10
void inplace_space(int *x,int *y){ *y=*x^*y;/* Step1 */ *x=*x^*y;/* Step2 */ *y=*x^*y;/* Step3 */ }
每个元素就是它自身的加法逆元(a^a=0)
步骤 | *x | *y |
初始 | a | b |
第一步 | a | a^b |
第二步 | b | a^b |
第三步 | b | a |
练习2.11
A变量first和last都为k+1
B由上图可知第一步时last值就为0(a^a)了
C去掉=即可
void reverse_array(int a[],int cnt){ for(int first=0,last=cnt-1;first<last;inplace_space(&a[first++],&a[last--])); }
练习2.12
Ax&0xFF
Bx^~0xFF
Cx|0xFF
练习2.13
$bis(x,y)$
$bis(bic(x,y),bic(y,x)) ightarrow$x^y=(x&~y)|(~x&y)