论坛风格切换切换到宽版
  • 3488阅读
  • 4回复

C语言的初级问题! [复制链接]

上一主题 下一主题
离线接收
 
发帖
834
只看楼主 倒序阅读 0楼 发表于: 2008-01-19
51c语言的疑惑。。


很困惑。。。初学c语言,各位帮忙看看,代码如下:
# include "reg51.h"
void main()
{
  while(1)
  {
  unsigned long freq,tmp;
  long temp;
  unsigned char i=9;
  freq=99900;
  tmp=freq;
  temp=i*10000;
  }
}

执行到tmp=i*10000时,为何temp的值是24464,面不是90000,困惑不解。
谢谢
离线Apple
发帖
759
只看该作者 1楼 发表于: 2008-01-19
越界
65535+24464+1=90000
你这个long型的定义可能是2byte范围是-32767~32768吧.
离线小比尔/5
发帖
2582
只看该作者 2楼 发表于: 2008-01-19
[quote=接收]51c语言的疑惑。。
谢谢[/quote]

这是个隐式转换的问题
长整数型的10000应该写成 10000l
如果写成10000,因为i是unsigned char,在i*10000运算中,最大的数据类型是10000,即unsigned int,所以c就会按照unsigned int类型计算,结果当然就是溢出,高位丢失了。

前面的freq=99900这句话也是不规范的,应该写成freq=99900l,但是因为这个数比65535大,所以keil会把它当成长整数型来处理。

另外,没必要把运算一直放在循环里。

解决的方法是:

#include "reg51.h"

void main()
{
  unsigned long freq,tmp;
  long temp;
  unsigned char i=9;
  freq=99900l;
  tmp=freq;
  temp=i*10000l;
  while(1);
}
离线接收
发帖
834
只看该作者 3楼 发表于: 2008-01-19
[quote=小比尔/5]这是个隐式转换的问题
长整数型的10000应该写成 10000l
如果写成10000,因为i是unsigned char,在i*10000运算中,最大的数据类型是10000,即unsigned int,所以c就会按照unsigned int类型计算,结果当然就是溢出,高位丢失了。

前面的freq=99900这句话也是不规范的,应该写成freq=99900l,但是因为这个数比65535大,所以keil会把它当成长整数型来处理。

另外,没必要把运算一直放在循环里。

解决的方法是:

#include "reg51.h"

void main()
{
  unsigned long freq,tmp;
  long temp;
  unsigned char i=9;
  freq=99900l;
  tmp=freq;
  temp=i*10000l;
  while(1);
}[/quote]
问题成功解决了,谢谢楼上的!
离线BA5RW
发帖
48263
只看该作者 4楼 发表于: 2008-01-21
qdm:明天过来的时候记得把我那台天线分析仪样机带过来,QAR要用.