初级会员

- 积分
- 58
- 金钱
- 58
- 注册时间
- 2013-11-1
- 在线时间
- 0 小时
|
5金钱
unsigned int RecvByte()
{
uchar rdata = 0x00,i;
uchar flag;
for(i = 0;i < 8;i++)
{
SDA_1;
delay_15us();
SCL_1;
SDA_IN;
delay_15us();
flag = SDA_VAL;
rdata <<= 1;
if(flag)rdata |= 0x01;
SDA_OUT;
SCL_0;
delay_15us();
}
return rdata;
}
short read(uchar Address)
{
uchar msb, lsb;
short _data;
Start(); //起始信号
SendByte(SlaveAddress); //发送设备地址+写信号
SendByte(Address); //发送存储单元地址
Start(); //起始信号
SendByte(SlaveAddress+1); //发送设备地址+读信号
msb = RecvByte(); //BUF存储
Sendack(); //回应ACK
lsb =RecvByte();
Sendnack(); //最后一个数据需要回NOACK
Stop(); //停止信号
delay_ms(5);
_data = msb << 8; //???
_data |= lsb;
return _data;
}
我的疑问就是打“???”的地方,《的优先级是高于=的,msb是uchar型,数据大小为8位,那么它左移8位不就都成0x00了吗?按道理,_data应该为0x0000,但是编译结果_data的高8位就是msb没左移之前的值,并不是0x00.
我就是想知道它是怎么转换的呢?
|
最佳答案
查看完整内容[请看2#楼]
在运算时不同类型的数据要先转换成同一类型,然后进行运算。针对你的问题简单说一下,_data = msb<<8进行运算时,编译器将uchar类型的数据转换为和_data一样的数据,此时msb就是16位的数据啦。所以右移8位后msb不是0X00。至于编译器为什么会将uchar型数据转换为short类型,这个是有规则的,具体规则请参考谭浩强《C程序设计 第三版》54页 各类数值型数据间的混合运算。
|