十二天深入理解计算机系统(二)
信息的表示和处理
1 理解字节序(大端、小端)
可以参考博客大小端介绍以及判断
2 位级运算
一个有趣的应用使用异或实现两个元素之间的交换。
void inplace_swap(int *x, int *y)
{
*y=*x^*y;
*x=*x^*y;
*y=*x^*y;
}
3 逻辑运算符和位级运算符的一个重要区别
如果第一个参数求值就能够确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。
4 逻辑右移和算术右移的区别
例如[xn-1...x0],逻辑右移k位的结果为[0..0,xn-1..xk],算术右移k位的结果为[xn-1,xn-1..xn-1..xk]。C语言中无符号的右移一定是逻辑的,有符号几乎所有的编译器/机器组合都对有符号数据使用算术右移。
5 C语言有符号和无符号数
-1<0u,大家猜想这个的条件是什么,是false,C语言隐式强制把有符号数转换为无符号数。
总结
数的表示,应该注意一些隐式转换,数据转换之间要注意。