an interview question(4)

版权声明:本文为博主原创文章,未经博主允许不得转载。

写这篇博客前请让博主先吐糟下自己的PC.

i3+2G内存+开了一上午=C盘剩下0字节+打开VS2012花了半个小时+一晚上的心情不好

吐槽完PC,再说下今天下午的面试。。

今天也真是囧的不行,面试的时候面试官带着我找会议室,结果发现每个会议室都有人在面试,无奈,最后在三楼的一个拐角处正好有个桌子,就开始了面试。。

面试官还是个女技术员,囧的来了,估计面试的公司对控制这块应用的比较多,而我大学接触到的控制,算法却比较少,我就讲着自己大学里做过的项目,基于STM32啥啥啥blablabla。。。,女技术员估计没接触过STM32,所以看起来也不知道我在说啥,完了就问我这个项目用的什么通信协议,我心想这下有的聊的,我就说uip协议,是一个短小精悍的嵌入式网络协议。。女面试官脸色又犯难了,我心想,卧槽,看来没听过uip协议啊,这没法聊了啊。。女技术员停顿了一会开始放大招了,问我,你接触过DSP吗?我就老老实实答说,上过这门课,做过简单的实验,但是没有深究,没用来做过项目。然后她又问,你知道modbus,我说知道,只是听过。。(因为这个也是我大学里逛论坛时看过的,但是没拿来研究过,只是知道有这么个通信协议),完了又问我知道can协议吗,我说知道,只是听过,我说完我自己都后悔,说实话,这也是以前逛论坛时看到的,也没哪来细究过。女面试官又停了会,我心想歇菜了,估计下一句就是回家等通知了吧(毕竟这是最完美的企业拒绝方式 : ))。女研究员站起来了,然后我也站了起来,女研究员又说,那个你先等会。然后她转身去了一个办公室,然后就听到她和一个男性在说话,过了一会出来后,跟我说,你进去跟我们技术总监聊下吧。技术总监?尼玛,快吓尿了啊,不过之前也是有多家面试经验了,于是我就故作淡定带着微笑的进去了,进去后,坐下来,技术总监并没有问我技术上的问题,反而问了好多人生理想,目标,职业规划的问题,说实话,我还真从来没准备过他问的那几个问题,也只能快速转着脑袋应对,聊了估计有好几十分钟,聊的也挺开心,最后也算是领悟到一些东西,也挺感谢他的。

好了,吐槽结束!

正文开始~~

今天这个面试题很简单,但是我花了好长时间去研究,主要也是被书中的作者解析误导,不然这篇博客也不会到现在还没写好(昨晚一晚上加今天一上午T_T)。

先贴代码~

1 #include <iostream>
2 using namespace std;
3 int main ()
4 {
5     unsigned char a=0xa5;
6     unsigned char b=~a>>4+1;
7     printf("b=%d\n",b);
8     return 0;
9 }

这里应该是考察两个概念:1.运算符号的优先级的问题.2.类型转换的问题。

类型转换的问题详见上篇博客。: )

对于算符的优先级问题,是先取反,还是先右移,还是先加?

好吧,其实我也不知道,但是汇编一定知道。: )

贴上反汇编代码~(只从主函数开始截)

 1 int main ()
 2 {
 3 002D436A  push        esi  
 4 002D436B  push        edi  
 5 002D436C  lea         edi,[ebp-0D8h]  
 6 002D4372  mov         ecx,36h  
 7 002D4377  mov         eax,0CCCCCCCCh  
 8 002D437C  rep stos    dword ptr es:[edi]  
 9     unsigned char a=0xa5;
10 002D437E  mov         byte ptr [a],0A5h  
11     unsigned char b=~a>>4+1;
12 002D4382  movzx       eax,byte ptr [a]  
13 002D4386  not         eax  
14 002D4388  sar         eax,5  
15 002D438B  mov         byte ptr [b],al  
16     printf("b=%d\n",b);
17 002D438E  movzx       eax,byte ptr [b]  
18 002D4392  mov         esi,esp  
19     printf("b=%d\n",b);
20 002D4394  push        eax  
21 002D4395  push        2DCC70h  
22 002D439A  call        dword ptr ds:[2E03B8h]  
23 002D43A0  add         esp,8  
24 002D43A3  cmp         esi,esp  
25 002D43A5  call        __RTC_CheckEsp (02D12D0h)  
26     return 0;
27 002D43AA  xor         eax,eax  
28 }

 

第十条语句表示,将a5h填在[a]的一个字节处。12表示将[a]处的一个字节填到eax寄存器中,这里的movzx将eax扩展到了32位!而并非XX宝典中的16位!此时的eax为0x000000a5,13表示取反,eax为0xffffff5a,14表示右移,且高位不变,所以此时的exa为0xfffffffa,15表示将低八位填到[b]所在的一个字节处,也正是对应C中的赋值给一个unsigned char b变量发生字节截断,此时的b为0xfa,也就是十进制的250。

 

以上使用汇编语言解释,这样更容易理解,如果用C来解释的话是什么呢,根据C99标准中的“integer promotions”:在对a进行4移位时,会把a提升到整形,即四个字节,再赋值给unsigned char时又会发生字节截断。同样可以得到b的值为250。: )

关于C99中的”integer promotions“还有很多值得细究的东西,后面我会进一步学习。:)

 

posted @ 2016-01-20 13:33  Koestler  阅读(178)  评论(0)    收藏  举报