程序员面试宝典。。。突破心理防线

今天偶然看见有朋友书架上有一本程序员面试宝典,前四章非技术,没仔细看。从第五章开始。习题的确是抠得很细但不小的内容。第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。

 

 

 

另发现编译原理龙书第一版的前端讲得比较好;第二版的后端讲得比较好。结合起来看更受益。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值