[AVR单片机] **中VC里面编写这样的 程序就会出错

[复制链接]
7098|30
 楼主| ATmega32L 发表于 2008-5-13 12:57 | 显示全部楼层 |阅读模式
这里首先假设unsigned char是8位
unsigned char resh;

如果int是16位,那么
resh<<8是16位,

如果int是32位,那么
resh<<8是32位.
HWM 发表于 2008-5-13 13:12 | 显示全部楼层

若没有“承接变量”所谓16位和32位没啥意义。

宇宙飞船 发表于 2008-5-13 13:14 | 显示全部楼层

楼主是欺负俺们不懂C吧?呵呵,


 楼主| ATmega32L 发表于 2008-5-13 13:33 | 显示全部楼层

理解C语言类型提升,才能写出更准确的代码.

理解C语言类型提升,才能写出更准确的代码.
这个程序并没有问题.

unsigned int USART_Receive(void)  
{
     unsigned char status,resh,resl;   
     while (!(UCSRA&(1<<RXC)));  
     status=UCSRA;  
     resh=UCSRB;  
     resl=UDR;  
     if(status&(1<<FE)|(1<<DOR)|(1<<PE)) 
          return -1;  
     resh=(resh>>1)&0x01;  
     return ((resh<<8)|resl);  
}  
t.jm 发表于 2008-5-13 14:09 | 显示全部楼层

是没问题,

我想老马也不至于骗人吧,所以我特地写了个测试程序!
但是为安全起见还是强制转换好些.
宇宙飞船 发表于 2008-5-13 14:44 | 显示全部楼层

楼主别教坏俺,char 符形一直都是8位的,

别维护老马了,他写的那个例程的确很垃圾!
void  main(void)
{
  unsigned char buf;
  buf=1234 ;//0x4D2 
}

//执行结果 buf = D2 ;
宇宙飞船 发表于 2008-5-13 14:57 | 显示全部楼层

老马有可能是教书的,只会纸上谈兵!

老马对硬件的不了解可见一斑!
 resl=UDR;  
 if(status&(1<<FE)|(1<<DOR)|(1<<PE))
 return -1;  
音乐乐乐 发表于 2008-5-13 15:04 | 显示全部楼层

**中VC里面编写这样的 程序就会出错

 一个8位左移8位就没了。
t.jm 发表于 2008-5-13 15:10 | 显示全部楼层

飞船很顽固,一点反省都没有!

void  main(void)
{
    unsigned int iBuf;
    unsigned char cBufH,cBufL;
    
    cBufH = 0x12;
    cBufL = 0x34;
    iBuf = (cBufH<<8) | cBufL; //iBuf=0x1234;
}
宇宙飞船 发表于 2008-5-13 15:17 | 显示全部楼层

呵呵!

t.jm 发表于 2008-5-13 15:10 AVR 单片机  ←返回版面  按此察看该网友的资料 按此把**加入收藏夹 按此编辑本帖

9楼: 飞船很顽固,一点反省都没有!

void  main(void)
{
    unsigned int iBuf;         //为啥不定义成char ??????
    unsigned char cBufH,cBufL;
    
    cBufH = 0x12;
    cBufL = 0x34;
    iBuf = (cBufH<<8) | cBufL; //iBuf=0x1234; //这当然正确!
}
t.jm 发表于 2008-5-13 15:37 | 显示全部楼层

既然大家都知道,那不就结案了!

unsigned int USART_Receive(void);
因为这个函数的返回值是unsigned int.
所以return ((resh<<8)|resl);  是没错的,

当然我也明白这样是不安全的,不符合代码规范,只是用来告诉初学者个种原由.
发表于 2008-5-13 16:14 | 显示全部楼层

看热闹.....

kanprin 发表于 2008-5-13 17:54 | 显示全部楼层

11楼正解

呵呵,为啥飞船能理解10楼的情况正确而不能消化返回int也一样呢?
zhousd 发表于 2008-5-13 18:08 | 显示全部楼层

还以为楼主有啥新发现!能读懂linux内核再在这扯吧!

gooog 发表于 2008-5-13 18:12 | 显示全部楼层

同意4楼

这个程序没有问题,我在turbo c上验证了。


飞船太绝对了。
zhousd 发表于 2008-5-13 18:18 | 显示全部楼层

看来AVR坛子没啥高手!连俺都看出来了。

t.jm 发表于 2008-5-13 19:25 | 显示全部楼层

飞船,我发现原来

那不是老妈马的错,那段代码出至DATASHEET的142,少两个括号,老马也是照操,我还以为是LZ的错。你也别沾沾自喜啊,这个错连编译器都有提示!
HWM 发表于 2008-5-13 19:56 | 显示全部楼层

争个啥

没看懂这句话吗?——若没有“承接变量”所谓16位和32位没啥意义

单看resh<<8有意义吗?

16或32位处理机的中间结果(寄存器)就是16或32位,这和它的指令系统有关,和C标准无关。
simon21ic 发表于 2008-5-14 00:43 | 显示全部楼层

最后的return部分应该没问题

不过我都是加上强制类型转换

但既然函数返回类型为unsigned int,那么为什么要return -1?
当然,可能只是多一些编译器的警告而已。但偶是不会写这种代码的
hotpower 发表于 2008-5-14 01:41 | 显示全部楼层

学习了...

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

本版积分规则

144

主题

376

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部