C语言右移操作在汇编层面的相关解释
在 CSDN 看到帖子回复如下:
x=y>>2;
004122A8 mov eax,dword ptr [y]
004122AB sar eax,2 '算术移位
004122AE mov dword ptr [x],eax
x=((unsigned int)y)>>2;
0041228D mov eax,dword ptr [y]
00412290 shr eax,2 '逻辑移位
00412293 mov dword ptr [x],eax
x=(0x0|y)>>2;
00412296 mov eax,dword ptr [y]
00412299 sar eax,2 '算术移位
0041229C mov dword ptr [x],eax
x=(0xFFFFFFFF&y)>>2;
0041229F mov eax,dword ptr [y]
004122A2 shr eax,2 '逻辑移位
004122A5 mov dword ptr [x],eax
故有人问,为何 x=(0x0|y)>>2; 是算术移位,而 x=(0xFFFFFFFF&y)>>2; 是逻辑移位。
实际上,不难看出当 0x0 | y 时,将产生与 y 相同的表达式值,所以 (0x0 | y) >> 2 和 y >> 2 一样都是算术移位(它们都是 int 数据类型,有符号)
而当 0xFFFFFFFF & y 时,无论 y 的值为多少,0xFFFFFFFF 这个字面值(只要 int 数据类型的字面值超过 0x7FFFFFFF)会被编译器当做无符号数处理,所以 & 运算将进行无符号数的按位与运算,也会产生一个无符号数的结果,故最终进行无符号的移位(逻辑移位)
对于,0xFFFFFFFF 这样的字面值,可以用以下方式验证

它将产生这样的编译错误:

这说明了,编译器的确将 0xFFFFFFFF 这个字面值当成了无符号类型。
以上。
C语言右移操作在汇编层面的相关解释的更多相关文章
- Linux内核--C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...
- 从汇编层面深度剖析C++虚函数
文章出处:http://blog.csdn.net/linyt/article/details/6336762 虚函数是C++语言实现运行时多态的唯一手段,因此掌握C++虚函数也成为C++程序员是否合 ...
- Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_【转】
转自:http://www.bkjia.com/Androidjc/1109412.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器, ...
- 位图文件格式及linux下C语言来操作位图文件
说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图片往往很大.在Windows下,任何格式的图片文件都要转 ...
- GCC在C语言中内嵌汇编 asm __volatile__ 【转】
转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达 ...
- 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码
浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...
- GCC在C语言中内嵌汇编 asm __volatile__
2012-11-26 22:20 17958人阅读 评论(2) 收藏 举报 分类: linux(59) 架构管理(24) C/C++(59) 目录(?)[+] 在内嵌汇编中,可以将C语言表达式 ...
- go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )
go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...
- C语言字符串操作总结大全(超详细)
本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat( ...
随机推荐
- 2015 测试赛 大神和小伙伴 hihoCoder
立方和公式和平方和公式.表示从来不记得这些公式... 每库礼物不同数量相同,总数=1+2+...+n=(n+1)*n/2 选取礼物的可能性的最大值为[(n+1)*n/2]^3 选取礼物价值重复两次的总 ...
- 全部对于Unity3D中 NGUI 触发事件的监听方法
NGUI事件的种类非常多.比方点击.双击.拖动.滑动等等,他们处理事件的原理差点儿万全一样,本文仅仅用button来举例. 方法一.直接监听事件 把以下脚本直接绑定在button上.当button点击 ...
- HTML_项目符号使用图片
本文出自:http://blog.csdn.net/svitter 创建一个HTML页面. 其内容为一个无序列表. 列表中至少包括了5本畅销书,每本书之前的项目符号必须採用概述封面的缩略图. 这些信息 ...
- [WebGL入门]二十三,反射光的光照效果
注:文章译自http://wgld.org/,原作者杉本雅広(doxas).文章中假设有我的额外说明.我会加上[lufy:],另外,鄙人webgl研究还不够深入.一些专业词语.假设翻译有误.欢迎大家指 ...
- 关于MySQL错误 2005 - Unknown MySQL server host 'localhost' (0) 原因及解决方法
今天在外面开navicat for mysql的时候,怎么也连不上自己本机上的数据库,一直显示2005 - Unknown MySQL server host 'localhost' (0): 错误代 ...
- MapReduce编程实战之“高级特性”
本篇介绍MapReduce的一些高级特性,如计数器.数据集的排序和连接.计数器是一种收集作业统计信息的有效手段.排序是MapReduce的核心技术,MapReduce也可以运行大型数据集间的" ...
- 一个效果非常华丽的仿桌面APP,却胜似Launcher
开发Android APP的同学是否对于Launcher实现的绚丽效果而痴迷呢?什么.连Android Launcher是什么都不知道.好吧,拿起侬的手机.在解锁后的首页界面上左右滑动滑动,体验体验, ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465603 Android系统Recovery工作原理之使用update.zip ...
- C 非标准库(conio.h)
所谓的 C 标准库(C standard library),是指在 ISO C 或者 POSIX 标准中定义的: POSIX is a superset(超集) of the standard C l ...
- CentOS7 内核参数优化
# allow testing with buffers up to 128MBnet.core.rmem_max = 134217728net.core.wmem_max = 134217728# ...