找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2329|回复: 9
收起左侧

C语言取反问题

[复制链接]
ID:135253 发表于 2020-7-10 11:12 | 显示全部楼层 |阅读模式
#define    LED     1<<7
rGPFDAT=~LED;     //结果rGPFDAT=0xFFFFFF00

若将定义改为
#define    LED      0x80

rGPFDAT=~LED;     //结果rGPFDAT=0xFFFFF7F

在ADS1.2下,怎么结果就不一样呢?



回复

使用道具 举报

ID:795921 发表于 2020-7-10 12:13 | 显示全部楼层
0xFFFFF7F应该是正确的结果
回复

使用道具 举报

ID:764088 发表于 2020-7-10 13:41 | 显示全部楼层

这是 数据宏定义不同造成 ,LED本身 是无符号数还是有符号不同,您试着 将LED 及~LED打印值试试看。
回复

使用道具 举报

ID:790644 发表于 2020-7-10 19:43 | 显示全部楼层
有符号数和无符号数的区别吧
回复

使用道具 举报

ID:282850 发表于 2020-7-11 17:04 | 显示全部楼层
#define    LED     1<<7           有问题,看define的详细说明
所以rGPFDAT=~LED;结果是rGPFDAT =~1<<7的运算模式,本意是要 =~(1<<7)
~比<<优先3级。
回复

使用道具 举报

ID:801733 发表于 2020-7-11 19:13 | 显示全部楼层
#define    LED     1<<7 写法不规范,要加括号#define    LED    ( 1<<7)才行
因为编译的时候LED并不是0x80,而是‘1<<7’这四个字符,所以当~LED时,实际的语句是~1<<7,等同于(~1)<<7,结果就是0x00,对于32位MCU来说会自动补足前面的24位,变成0xFFFFFF00
回复

使用道具 举报

ID:801829 发表于 2020-7-11 22:44 | 显示全部楼层
第一句需要括号括住,#define只是宏定义,在程序里面相当于替换,就会变成=~1<<7,取反运算符比左移运算符的优先级高,建议你以后写的时候这样:#define LED  (1<<7)
回复

使用道具 举报

ID:135253 发表于 2020-7-12 11:04 | 显示全部楼层
robin1024 发表于 2020-7-11 19:13
#define    LED     1

多谢多谢
回复

使用道具 举报

ID:135253 发表于 2020-7-12 11:04 | 显示全部楼层
f556 发表于 2020-7-11 17:04
#define    LED     1

多谢多谢
回复

使用道具 举报

ID:135253 发表于 2020-7-12 11:05 | 显示全部楼层
谢谢楼上各位的回复解答!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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