找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5743|回复: 0
打印 上一主题 下一主题
收起左侧

C语言中Uint和int类型数据的移位操作

[复制链接]
跳转到指定楼层
楼主
ID:51088 发表于 2014-8-20 02:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                                                                                                int i,j,m;
       i = 0x00CF;
       j = 0xDE43;
       m = (i << 8) | (j >> 8);

执行后结果是?
       m = 0xFFDE,而不是0xCFDE。

看一下汇编后的指令:
MOV ACC, *-SP[6] << 8    ;ACC = 0x0000CF00
MOV AH, *-SP[5]    ;ACC = 0xDE43CF00
ASR AH,8    ;ACC = 0xFFDECF00
OR  AH, @AL    ;ACC = 0xFFDECF00
MOV *-SP[7], AH    ;m = 0xFFDE(返回值)

因为j是整型数,所以右移操作编译后是带符号的算术右移指令 ASR。
把j改为Uint后,右移操作编译后是无符号扩展的逻辑右移指令 LSR。

如果希望得到m = 0xCFDE的结果,那么可以把i、j、m定义为无符号数:
Uint i,j,m;
       i = 0x00CF;
       j = 0xDE43;
       m = (i << 8) | (j >> 8);

看一下汇编后的指令:
MOV ACC, *-SP[6] << 8    ;ACC = 0x0000CF00
MOV AH, *-SP[5]    ;ACC = 0xDE43CF00
LSR AH,8    ;ACC = 0x00DECF00
OR  AH, @AL    ;ACC = 0xCFDECF00
MOV *-SP[7], AH    ;m = 0xCFDE(返回值)

注:MPU为TMS320F2812。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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