最近在复习计算机基础知识,断断续续的记录在这里吧。
深入理解计算机系统是本好书,对底层的实现原理从程序员的角度进行的细致的讲解,不愧为经典,深得大家的喜爱。
其中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
时间: 2024-09-28 23:20:26