找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C语言取反和移位操作的陷阱

[复制链接]
跳转到指定楼层
楼主
ID:388768 发表于 2019-4-10 13:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uint8_t port = 0x5a ;

uint8_t result_8 ;

result_8 = (~port) > > 4 ;
result_8 = ?

我们期望的结果是resuIt_8=0x0a。然而,由于整型的位扩充原则,在16位编译器中,~port的值是Oxffa5;在32位编译器中,~pott的值是Oxffffffa5。无论哪种情况,最后结果(右移4位后 赋值给result_8的时候有一个截断操作)都是resuIt_8=Oxfa,而非预期的result_8=Ox0a。 倘若将最后一行代码改成result一8=((uin8_t)(~port))>>4,则result_8可取得预期的值. 注意一点: 逻辑操作符不遵循上述“平衡”原则。此外左移(<<)和右移(>>)运算符也不遵循“平衡”原则.

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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