打印

关于一个赋值语句的疑问……

[复制链接]
1624|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuyansky|  楼主 | 2013-10-29 17:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
wuyansky|  楼主 | 2013-10-29 17:53 | 只看该作者
是因为SDA是bit型的,不能将byte型的数据赋给它么?
可是系统应该会进行强制类型转换的吧?
请帮帮小弟吧!

使用特权

评论回复
板凳
wuyansky|  楼主 | 2013-10-29 21:26 | 只看该作者
没有人回答么?:'(

使用特权

评论回复
地板
i55| | 2013-10-29 21:37 | 只看该作者
如果你用的是C51的bit型,那么两句话没有任何差异。
上面的那句通用性更好一些,换别的编译器也木啥问题,下面的对于Keil C51这个编译器来说更简洁合理。

使用特权

评论回复
5
ayb_ice| | 2013-10-30 08:07 | 只看该作者
一个是显示赋值,一个是隐含类型转换,语句1更通用些,可读性好,移值性更好

使用特权

评论回复
6
很忙| | 2013-10-30 08:40 | 只看该作者
5楼确实是高手啊,概括的很精辟。个人觉得还是第一个好,可读性好。便于理解代码。

使用特权

评论回复
7
zhaozhi0810| | 2013-10-30 09:00 | 只看该作者
下面的那句是错的。SDA只能接收0或1,如果按你的方法,且认为dat = 1(只是假设,其他任何数都可以); i = 0~7;第一次SDA = 0;第二次SDA = 0;。。。。第八次SDA = 0;本来 ((dat<< 7)&0x80) = 0x80 (i = 7的时候);但是SDA只接受最低位,还是零。所以这个数据没办法发出去。

使用特权

评论回复
8
wuyansky|  楼主 | 2013-10-30 17:50 | 只看该作者
i55 发表于 2013-10-29 21:37
如果你用的是C51的bit型,那么两句话没有任何差异。
上面的那句通用性更好一些,换别的编译器也木啥问题, ...

谢谢!如果别的编译器有问题,是什么造成的呢?

使用特权

评论回复
9
wuyansky|  楼主 | 2013-10-30 17:51 | 只看该作者
zhaozhi0810 发表于 2013-10-30 09:00
下面的那句是错的。SDA只能接收0或1,如果按你的方法,且认为dat = 1(只是假设,其他任何数都可以); i = ...

可是我试过了,给某个I/O口赋值为0x80,输出是高电平没问题啊。这说明它不是取最低位的?

使用特权

评论回复
10
bingmcu| | 2013-10-30 18:34 | 只看该作者
SDA=((dat<< i)&0x80)?1:0;

相等于:
if( ((dat<< i)&0x80) )
{
   SDA =1;
}
else
{
   SDA =0;
}

使用特权

评论回复
11
wuyansky|  楼主 | 2013-10-30 20:19 | 只看该作者
bingmcu 发表于 2013-10-30 18:34
SDA=((dat

谢谢,这个我知道啊。我的问题是,SDA=0x80 和 SDA=1 有区别么?

使用特权

评论回复
12
bingmcu| | 2013-10-30 21:55 | 只看该作者
本帖最后由 bingmcu 于 2013-10-30 21:56 编辑
wuyansky 发表于 2013-10-30 20:19
谢谢,这个我知道啊。我的问题是,SDA=0x80 和 SDA=1 有区别么?

SDA 如果为单个IO口的话,即 SDA 为BOOL 型变量,只能为 0 或 1。这个时候 SDA=0x80 和 SDA=1 效果是一样的,最后的运行结果 SDA = 1。

使用特权

评论回复
13
zhaozhi0810| | 2013-10-31 08:38 | 只看该作者
12楼是对的

使用特权

评论回复
14
wuyansky|  楼主 | 2013-10-31 11:55 | 只看该作者
bingmcu 发表于 2013-10-30 21:55
SDA 如果为单个IO口的话,即 SDA 为BOOL 型变量,只能为 0 或 1。这个时候 SDA=0x80 和 SDA=1 效果是一样 ...

懂了,多谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

84

帖子

1

粉丝