深入理解计算机系统学习(位扩展)

最近在复习计算机基础知识,断断续续的记录在这里吧。

深入理解计算机系统是本好书,对底层的实现原理从程序员的角度进行的细致的讲解,不愧为经典,深得大家的喜爱。

其中CPU对于有符号,无符号转化以及位的扩展引起的溢出问题需要理解,并在写c的时候避免,有时候编译不报错,

但是却存在隐患。

 

1、无符号扩展直接高位补0

例如,无符号扩展

     unsigned short e = 100;
     int f = e; 
     printf("e= %.2xH\n", e);
     show_bytes((byte_pointer)&e, sizeof(e));

     printf("f= %.2xH\n", f);
     show_bytes((byte_pointer)&f, sizeof(f));

输出


e= 64H
6400

其中 e = 64 是 整数 100 对应的十六进制,其后的6400 的机器里面的存储的字节顺序,我的机器是 centos 64位,是大端机,
也就是低位在高位,高位在低位存储。

比较容易理解的顺序是

 0064

short 类型是16位,2个字节


f= 64H
64000000

其中 f = 64 是 整数 100 对应的十六进制,其后的64000000的机器里面的存储的字节顺序

 int类型是32位,4个字节,所以是

00000064

2、有符号正数扩展

   高位也是补0

     short g = 32767;
     int h = g;
     printf("g= %.2x\n", g);
     show_bytes((byte_pointer)&g, sizeof(g));

     printf("h= %.2x\n", h);
     show_bytes((byte_pointer)&h, sizeof(h));

 输出结果  

       g= 7fff
        ff7f
        h= 7fff
        ff7f0000

short g = 32767 的二进制表示是 0111 1111 1111 1111

十六进制是7ffff

in h=g 的话

  二进制表示是

   0000 0000 0000 0000 0111 1111 1111 1111

十六进制是 0000f7ff

 高位补了0了

 

3、有符号负数扩展

    高位补1

    short j = -32768;
     int k = j;
     printf("j= %.2x\n", j);
     show_bytes((byte_pointer)&j, sizeof(j));

     printf("k= %.2x\n", k);
     show_bytes((byte_pointer)&k, sizeof(k));

输出结果 

 j= ffff8000
0080
k= ffff8000
0080ffff

short j = -32768 的二进制表示是  1000 0000 0000 0000 
j的printf("j= %.2x\n", j) 为 ffff 8000, 预想是8000,多输出了ff ff ,这个可能是printf 的机制,有时间研究一下。
接着字节顺序,因为是大端机所以输出了0080

int k = j;
把两个字节扩展为4个字节,二进制表示是 1111 1111 1111 1111 1000 0000 0000 0000
字节输出是 0080ffff




 

posted @ 2017-08-19 12:50  蜗牛码  阅读(1184)  评论(0编辑  收藏  举报