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

C++ same variable act as int and float

本文关键字:int float 变量 C++      更新时间:2023-10-16

我有一个情况,我需要保持值float和int。所以如下所示。但无济于事。有人能帮上忙吗?

union Val {
        int a;
        float b;
    };
    Val p;
    p.b = 45.56;
    int k = p.a; // i want k should be 45;

我看到你说:

我不想每次都把它从float转换成int〔原文如此〕

要做到这一点,您可以使用用户定义的转换来实现这一点。

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

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;}
};

请注意,您真正想要使用的只是floatstatic_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;

我遇到了这样的情况,我需要保持值的浮动和int。所以试着低于

你不能用工会来做这件事。联合在任何时候都只能在内部包含一个值。您需要两个独立的变量。如果你喜欢的话,你可以把它们放在结构的一边:

struct Val {
    int a;
    float b;
};

现在您可以同时拥有int和float。

 Val p;
 p.b = 45.56;
 p.a = p.b;
 int k = p.a; // no conversion

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

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

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

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