搜索
bottom↓
回复: 2

Cortex-M中有符号数右移是逻辑右移还是算术右移???

[复制链接]

出0入25汤圆

发表于 2013-1-7 14:01:13 | 显示全部楼层 |阅读模式

Cortex-M指令集中关于移位的指令有以下三条:
ASRS    {Rd,} Rn,<Rs|#imm>      算术右移
LSLS    {Rd,} Rn,<Rs|#imm>      逻辑左移
LSRS    {Rd,} Rn,<Rs|#imm>      逻辑右移

而C语言中用于移位的运算符只有“<<"和">>"两个,其中”<<"运算符毫无疑问对应LSLS运算,即不管是对应有符号数还是无符号数一律右边补零;那对于">>"运算符到底是执行算术右移ASRS呢?还是执行逻辑右移LSRS呢??

我在网上搜了一下,发现网上说:对于">>"的具体实现,C语言标准中并没有规定,而是具体的CPU实现相关的。。即可以是逻辑右移,也可以是算术右移,具体是什么看实现。。


我在MDK下测试了一下有符号数的">>"运算,发现执行的是算术右移。。但不知道这个是不是ARM强制规定的,还是MDK规定的,,如果我写了有符号数的右移运算,那么在MDK、IAR和GCC之间行为是一样的吗???


希望了解具体规定的大侠指点一下!!!谢谢了!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-1-7 14:44:49 | 显示全部楼层
C99标准中对移位运算的语义定义:
<<,无符号是左移;有符号正数,移位后如果计算结果能被正确表达,则是左移;剩下的情况都是未定义行为。(理解:有符号正数左移要求最高为1的那个位不能移动到符号位。等价于根据移位前的值,限制了可以进行的移位范围。)
>>,无符号逻辑右移;有符号数正数>>始终是高位补0(逻辑/算数都行);有符号负数是Implementation Defined。(理解:实际上这个给没有算数移位的处理器留了个空子,逻辑右移也没问题。)
详见C99标准6.5.7。

未定义行为是说标准没规定,咋样都行。
实现定义的行为要求文档说明。


GCC的实现:
目前(截止到4.7.2),<<是逻辑左移;>>无符号是逻辑,有符号是算数。
http://gcc.gnu.org/onlinedocs/gc ... gers-implementation

Keil MDK的实现:
截止到4.60,<<是逻辑左移;>>无符号是逻辑,有符号是算数。
armccref.chm (Compiler Reference Guide), C and C++ Implementation Details, C and C++ Implementation Details, Operations on basic data types.

出0入25汤圆

 楼主| 发表于 2013-1-7 19:12:46 | 显示全部楼层
dr2001 发表于 2013-1-7 14:44
C99标准中对移位运算的语义定义:
,无符号逻辑右移;有符号数正数>>始终是高位补0(逻辑/算数都行);有符 ...


大侠讲解的非常明白透彻,非常感谢!!!多谢大侠指教!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 16:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表