< 深入理解计算机系统 > 信息位的表示
字节 : 8 位的块 最小的可寻址的存储器单位
对于在机器上面的位, 对于相同的二进制序列, 用不同的方式去看表现出来的值就不一样, 比如 unsigned , 二进制补码等。
比如 Printf(“0x%x = %d /n”,val,val); 相同的东东, 但是不用的表现形式。
浮点数分为单精度, 双精度 (待补充)
对象的地址和我们在存储器中如果对这些字节排序。 对象地址肯定是所使用字节序列中最小的 , 排序的方法有两种, 大端 ,小端 , 一般的机器都是小端 ,
这个可以在编译内涵的 .config 文件看到, 我们平时的写字方法是大端保存的。
大多数时间我们是不用关心字节序的。 除了以下几种情况 1 ) 不同类型机器上面网络传输二进制数据时 2 ) 阅读表示整数数据的字节序列时 3 ) 编写规避正常的类型系统的程序时 。
typedef unsigned char * byte_pointer;
void show_bytes(byte_pointer * start, int len)
{
Int I;
For(I = 0 ; I < len; i++)
{
Printf(“ %.2x”,start[i]);
Printf(“/n”);
}
}
Void show_int(int x)
{
Show_bytes((byte_pointer)&x,sizeof(x));
}
%.2x 表示至少两个数字的十六进制格式输出
Ascii 码:
Man ascii
C 中的位级运算
& | ^ ~ 这个四种符号。 位级运算的一种常见用法是掩码运算。
C 中的位移运算
。。。。。。。。。。。。。
整数的表示:
有符号 和无符号
区别是最高位吧。, 区别在书上 p43
有符号和无符号数之间的转换。 位还是那些位, 一样, 理解的方式不同而已。 注意的就是隐式的转换。
扩展一个数字的位表示。
无符号数 直接加 0 , 二进制补码表示的数 扩展用最高位。 相同的数字, 进过转换,也可能不同
截断数字:
无符号数截断 k 位也就是相当于 mod 2**k 。 有符号数 就不同了。
总结: 以上这么多差异都是因为无符号数和有符号数对于同样的二进制序列,以不同的眼光去审视。 总之, 尽量少,谨慎的使用无符号数。
发现书后的习题那是相当的经典。
未完, 待续
注意两点就可以了
1: 所有的数,浮点数, 整数神马的,都是浮云, 都是些机器位 0 1 , 以不同的眼光去注视这些得到不同的结果、
2: 无符号数和 二进制补码
无符号没有什么好说的。特别注意(有符号数)二进制补码表示(在csapp p43 ) ,这样就好理解了。