C ++相同的变量充当int和float

时间:2016-04-19 12:00:01

标签: c++

我有情况,我需要保持值float和int。所以尝试如下。但没有帮助。任何人都可以帮忙吗?

union Val {
        int a;
        float b;
    };

    Val p;
    p.b = 45.56;

    int k = p.a; // i want k should be 45;

3 个答案:

答案 0 :(得分:1)

  

我有情况,我需要保持值float和int。所以尝试如下

你不能用联盟做到这一点。联合只能在任何时间保持单个值。你需要两个独立的变量。如果您愿意,可以将它们保留在结构中:

struct Val {
    int a;
    float b;
};

现在你可以拥有一个int和一个浮点数。

 Val p;
 p.b = 45.56;
 p.a = p.b;

 int k = p.a; // no conversion

也就是说,由于您显然只使用a来存储转化后的b值,因此您应该衡量转化是否会影响效果。

答案 1 :(得分:1)

我看到you say

  

我不想每次将它从float转换为int [原文如此]

为此,您可以使用user-defined conversions来完成此任务。

所以你的结构看起来像这样:

class Val {
    int a;
    float b;
public:
    Val& operator= (const int _a) {a = _a; b = _a + fmod(b, 1.0F); return *this;}
    Val& operator= (const float _b) {b = _b; a = trunc(_b); return *this;}
    operator int() {return a;}
    operator float() {return b;}
};

请注意,您真正想要使用的只是一个float static_cast<int> static_cast

  

在运行时期间不执行任何检查以确保转换的对象实际上是目标类型的完整对象。因此,程序员应确保转换是安全的。另一方面,它不会产生dynamic_cast的类型安全检查的开销。

我在这里提供了一个使用Val的示例:http://ideone.com/XUesib但您可以像float foo这样完成同样的事情:

foo = 1.3F;
cout << static_cast<int>(foo) << endl << foo << endl;
foo = 13 + fmod(foo, 1.0F);
cout << static_cast<int>(foo) << endl << foo << endl;

答案 2 :(得分:0)

您可以将结构与构造函数一起使用,并根据需要在其中初始化变量。

struct Val {
    int a;
    float b;
    Val(float value) {
        a = b = value;
    }
};

因此,您可以循环使用它并且不必每次都担心对话,只需在外部循环中创建Val变量并使用它。