今天偶然看见有朋友书架上有一本程序员面试宝典,前四章非技术,没仔细看。从第五章开始。习题的确是抠得很细但不小的内容。第5.4节是类型转换,这里考的是类型提升type promotion。题目如下:
#include <iostream>
using namespace std;
int main()
{
unsigned char a=0xA5;
unsigned char b=~a>>4;
printf("b=%d/n", a);
return 0;
}
作者给出的结果是对的,不过解释错误。“对于第二个问题:因为“>>”的优先级高于“~”,这个解释别开生面,突破了心理防线。我记得~优先级高于>>,google一下,确认了自己没错。于是作者后面的解释就是穿凿附会了。网上没有人解释这本书的这个问题,我就来试试吧。
如果 >> 高于 ~,那么 ~x>>1 恒等于 ~(x>>1)
敲如下代码就知道了
#include<stdio.h>
int main()
{
unsigned int x = 0x80000000;
unsigned int y = ~x>>1;
unsigned int z = ~(x>>1);
printf("%X =?= %X/n", y, z);
}
正确的解释如下:
对于语句 unsigned char b = ~a>>4;
~a :类型unsigned char =提升=> 类型int ,值0xA5 =not操作=> 值0xFF FF FF 5A
~a>>4 :值0xFF FF FF 5A =sar操作=> 值0xFF FF FF F5 (因为int,所以sar操作;若其类型为unsigned int,则shr操作)
对b赋值 :截断0xFF FF FF F5为0xF5,即245。
另发现编译原理龙书第一版的前端讲得比较好;第二版的后端讲得比较好。结合起来看更受益。