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的结果就是实型而不是整型了。这个问题很简单,但是有时我们很容易忽略,所以也值得注意一下。
得出的结论:
两个整型相除得到的结果只会是整型,要想得到与要赋值变量类型相同的结果,则相除的两数至少要有一个与要赋值变量的类型相同 ,或者使用强制类型转换也会得到准确的结果。
浙公网安备 33010602011771号