为什么从“int”到“float”的类型转换将我的值减半?

时间:2014-07-23 00:59:36

标签: c++ casting

我在回顾过去的测验后,今天在C ++中测试了类型转换,并且不能为我的生活找出为什么我的' x'值在以下代码中从9更改为4.5000。

int main(){
    int x = 9, y = 2;
    float z;
    z = (float)x/(float)y;
    printf("\n%f", z);
    printf("\n%f", x);
    printf("\n%d", x);
}

输出

4.5000
4.5000
9

我很感激任何帮助!

3 个答案:

答案 0 :(得分:8)

printf函数希望float位于堆栈上(因为%f)并且您只提供了int

在这种情况下,您需要将x投射到float

printf("\n%f", (float)x);

答案 1 :(得分:6)

printf("\n%f", x) int x {/ 1}}中,您 <{em}} xfloat - 您 假设< / em>它是一个浮动的。这就像给一名消防员递上一块黄油,并告诉他这是一个灭火器 - 不能正常工作。

要进行强制转换,您必须将值分配给强制转换兼容变量:

float floatX = x;
printf("\n%f", floatX);

或使用演员:

printf("\n%f", (float)x);

答案 2 :(得分:0)

它不会将你的X切成两半。看下面的代码,它仍然打印4.5

#include <stdio.h>

int main(){
    int x = 9, y = 2;
    float z;
    z = (float)x/(float)y;
    x = 15;
    printf("\n%f", z);
    printf("\n%f", x);
    printf("\n%d", x);
}

打印:

4.500000
4.500000
15

可能必须在内部执行浮点数和整数存储在堆栈中的方式。它很可疑,因为它是第一个存储的浮点值。如果我将代码更改为:

#include <stdio.h>
using namespace std;

int main(){
    int x = 11, y = 2;
    float z;
    z = (float)x/(float)y;
    x = 15;
    printf("\n%f", z);
    printf("\n%f", x);
    printf("\n%d", x);
}

输出

5.500000
5.500000
15

如果您不打印变量z,则输出变为

0.000000
15

因此可能与打印顺序有关。