问题的提出:

unsigned char a=0xA5;

unsigned char b=~a>>4;

注意~优先级高于>>,按照逻辑b应该为0x05

而结果b=0xf5,有点不符合逻辑,反编译(VC6,32位)看了一下,发现编译器把上面的代码编译成

mov           ecx, dword ptr[ebp-8]      ;ecx = 0xcccccca5

and            ecx, 0ffh                               ;ecx = 0x000000a5

not            ecx                                        ;ecx = 0xffffff5a

sar             ecx, 4                                    ;ecx = 0xfffffff5(注意移位后用1补齐!!!)

mov           byte ptr [ebp-10h], cl       ;cl = 0xfff5

反思一下,为了完成b=~a>>4,编译器做了三个工作

(1)申请了一个32位的临时变量x,将a扩展后,存入x

(2)将x取反

(3)将x右移4位,并将移位后x的低8位送给b

在第一步中,存在一个是否按符号位扩展的问题,这里a为unsigned型,不需要扩展,所以x = 0x000000a5;

若a为(signed) char型,则按符号位扩展后,x =0xffffffa5,取反后x = 0x0000005a,最终b=0x05。

下面在看一下关于符号位扩展的反编译代码

unsigned char a1 = 0xA5;

int a2 = a1;

这里扩展不需要补1,应为a1是unsigned类型的,所以编译器将上面代码译为

mov           byte ptr [ebp-4], 0A5h

mov           eax, dword ptr [ebp-4]

and            eax, 0FFh                                      ;eax = 0x000000a5

mov           dword ptr [ebp-18h], eax

对于下面的c代码,需要进行符号位扩展

char a1 = 0xA5;

int a2 = a1;

反编译后,可以看到一条movsx带符号扩展指令

mov           byte ptr [ebp-4], 0A5h

movsx       eax,byte ptr [ebp-4]         ;eax = 0xffffffa5

mov           dword ptr [ebp-18h],eax

不要小看 b=~a4相关推荐

  1. 太酷啦!我在A4纸上看宫崎骏动画

    转载自:量子位 随意弯曲.任意抖动,丝毫不影响我在纸上看<龙猫>. 这不是什么屏幕黑科技,而是AI合成的图像. 来自港中文-商汤联合实验室.浙江大学.英伟达的研究人员,用AI将图片视频投影 ...

  2. 我在A4纸上看宫崎骏动画

    杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 随意弯曲.任意抖动,丝毫不影响我在纸上看<龙猫>. 这不是什么屏幕黑科技,而是AI合成的图像. 来自港中文-商汤联合实验室.浙江 ...

  3. 【Arduino】利用FDC2214加LCD1602电容计测量A4纸张数量

    /** 名称:2019年全国电赛F题* 功能:极板电容测量A4纸张数量*/ #include <LiquidCrystal.h> const int rs = 7, en = 6, d4 ...

  4. 计算机视觉与模式识别(1)—— A4纸边缘提取

    转载自:http://blog.csdn.net/simba_scorpio/article/details/50974351 最近跟着老师学习了计算机视觉领域中,一个教科书般的知识点 -- 图形的边 ...

  5. 一张A4纸的牛B变化(你能吗?)

    原材料:A4纸 大家有兴趣也来做一下吧?其实不难的,不妨试一下? 转载于:https://www.cnblogs.com/hylan/archive/2008/11/28/1342768.html

  6. php制表网页打印到a4纸,A4纸网页打印 html网页页面的宽度设置成多少

    最近开发项目时遇到了网页打印的问题,这是问题之二,打印宽度设置 在公制长度单位与屏幕分辨率进行换算时,必须用到一个DPI(Dot Per Inch)指标. 经过我仔细的测试,发现了网页打印中,默认采用 ...

  7. Python也有做大型游戏的潜力?原来我们小看了Python,无所不能!!

    前言 在小编以前还没怎么接触很多编程语言时,都是认为游戏(端游,手游)都是用C做出来了!不知道大家有没有这么想过,反正我是这样的.后来慢慢接触多了,才知道并不是所有的都是这个样子的! 学习python ...

  8. elxel表格纸张尺寸_纸张知识|克重厚薄多少,正度大度纸开本尺寸规格是什么大小,和A4有啥区别?...

    什么是大度纸,正度纸? 大度正度是印刷业定义纸张尺寸的规格名称."度"即为纸张的度量."正"即为标准正规之意.纸张有国际标准和国内标准.国内标准的全开尺寸为10 ...

  9. How to show out three rows from the same databand On A4?

    How to show out three rows from the same databand On A4? Quote Post by DoraHuang » Tue Mar 13, 2018 ...

最新文章

  1. .NET设计模式(15):结构型模式专题总结
  2. 围住浮动元素(消除浮动)的三种方法
  3. 财物机器人英文ppt演讲课件_“如何恰当使用课件动画”
  4. Refusing to install package with name “vue-i18n“ under a package
  5. python列表、字典、元组的用法及区别_python列表,字典,元组简单用法示例
  6. python字典在编程中的作用_python中的字典操作及字典函数
  7. The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in u
  8. ContestHunter暑假欢乐赛 SRM 03
  9. [转][Android]Android数据的四种存储方式
  10. 图像频域增强:带通带阻滤波器
  11. 闲谈Python语言入门
  12. c# winform word模板 利用WORD 书签 定位替换 生成 WORD
  13. selenium获取html源代码
  14. 发送的邮件还能撤回吗?如何撤回已经发出的邮件?
  15. 集合collection
  16. 我的HTML学习------表格的基本使用
  17. Excel图表—波士顿矩阵分析图(四象限图)
  18. python 圆周率代码_基于Python计算圆周率pi代码实例
  19. 使用Arduino开发板控制伺服电机
  20. mPEG-SCM 甲氧基PEG琥珀酰亚胺乙酸酯

热门文章

  1. 音频卡拉OK,TYPEC声卡芯片
  2. 百炼智能店店通数据:2020年下半年餐饮行业闭店率超30%
  3. w7无法訪问计算机上硬盘分区,惠普笔记本win7系统无法调整硬盘分区的解决方法...
  4. w7计算机新加,win7系统新加硬盘分区的详细步骤
  5. 项目13 路由器与网桥的设置
  6. 错误处理(二)—— Exception from HRESULT: 0x800A03EC
  7. 微信小程序宠物论坛6
  8. itertools模块中的product方法
  9. VS2010 MFC通过OLE方式读写Excel文件(实例+工程文件)
  10. 数据懒加载和图片懒加载