VC++6.0中 数据类型转换的问题 / 为什么两数相除后得不到正确结果

数据类型是编程中最基础的知识,入门时很容易理解,但有时会因为编译器换算的问题,而得不到正确的答案。特别是做硬件的,像我这样,既搞硬件又搞软件一心想走嵌入式之路的人,有时会遇到要计算晶振频率,如果结果不对,直接导致频率不对,将会很大程度上影响到我们的系统设计。一个朋友要用9850产生本振,因为编译器换算的问题,得到的结果始终不对。他问我的问题是:

#define SYSTEMCLK 180000000
double y;
y=4294967295/SYSTEMCLK;

#define SYSTEMCLK 180
double y;
y=4294967295/SYSTEMCLK;
y=y/1000000;
这两种方式输出的y有什么区别呢,我做个实验出来的结果不一样。

然后我用VC++写了一小段代码,以验证这个问题,代码如下:

#include<iostream>
using namespace std;

#define SYSTEMCLK1 180000000
#define SYSTEMCLK2 180

void main()
{
  double x,y,z;
  x=4294967295/SYSTEMCLK1;
  y=4294967295/SYSTEMCLK2;
  z=y/1000000;
  cout<<"x:"<<x<<endl;
  cout<<"y:"<<y<<endl;
  cout<<"z:"<<z<<endl;
}

输出的结果是:

x:23

y:2.38609e+007

z:23.8609

 
x、z的值应该相等才是,但是事实上一个是整型一个是实型,x的值不对。是不是溢出了呢?答案是否定的,4294967295刚好是32处理器所能表示的最大值,所以这个问题跳过。其实,这个结果不对的原因是我们最容易忽略,如果将代码改成#define SYSTEMCLK1 180000000.0或x=4294967295.0/SYSTEMCLK1;或x=(double)4294967295/SYSTEMCLK1;那么x的结果就是实型而不是整型了。这个问题很简单,但是有时我们很容易忽略,所以也值得注意一下。
 
得出的结论:

两个整型相除得到的结果只会是整型,要想得到与要赋值变量类型相同的结果,则相除的两数至少要有一个与要赋值变量的类型相同 ,或者使用强制类型转换也会得到准确的果。

 

 

 

posted @ 2013-07-24 01:29  bigmoney  阅读(329)  评论(0)    收藏  举报