深入理解计算机系统(第三版)第二章重要内容摘要

第二章

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)

原文地址:https://www.cnblogs.com/GodZhuan/p/14249372.html