C语言——整型和浮点型混合运算

1. int和double混合运算

C语言int和double混合运算时,会自动将int类型的数据转换为double类型的数据,最后得到的结果也是double类型。如下例:

double a=4.0/9.0;
int b=9*a;//b=3,因为double类型的4.0/9.0的值要小于4.0/9.0的实际值(考虑到有效位数有有限的)

上面代码中,b=3,因为double类型的4.0/9.0要小于4.0/9.0的实际值,这是由于浮点型有效位数的限制造成的,所以9*a的值要小于4,赋值给int类型的时候发生截断,因此b=3。

2. 给浮点型数据赋初始值

给浮点型数据赋初始值的时候,如果用表达式赋初始值,如下式:

double c=4/9;
//c=0,因为4/9小于1,int类型截断后为0,然后赋给double类型,发生类型转换,但是结果仍是0;

则无法给c正确赋值,c得到的初始值是0,而不是4/9表示的小数。因此应该按照下式来赋值:

double c=4.0/9.0;

3. 使用#define宏定义时,显式地将数据写成浮点数形式

#define INDEX (4/9)

int main(void){
    int c=9*INDEX;//此时c=0,因为在编译阶段已经计算了INDEX 为0,所以c=9*0=0
    printf("%d",PI);//打印出的结果为“0”
    //其余代码
}

上面的代码展示了在#define宏定义阶段不正确的数据定义会导致一些错误的结果。如果我们希望#define宏定义的表达式表示一个浮点型数据,则应当在定义时显示表示其为浮点型。如下:

#define INDEX (4.0/9.0)

int main(void){
    double c=9*INDEX;//此时c=4,如果C是int类型,则c=3.
    printf("%f",PI);//打印出的结果为“0.444444”(printf输出浮点型默认6位小数)
    //其余代码
}

上述情况在使用#define宏定义一些浮点型数据的时候最容易发生,因此应当注意。

你可能感兴趣的:(C语言)