我有一个c++
项目,该结构的成员数据类型为int32_t
,并且我想为其分配bool
和float
变量,这会破坏值变量?如果是,除了更改struct成员数据类型外,我还应该做什么?
答案 0 :(得分:0)
每当编译器必须在需要其他类型的上下文中使用某个类型的值时,就会执行隐式转换。
隐式转换的规则为numerous,但在浮点-整数转换下,有以下段落:
浮点类型的prvalue可以转换为任何 整数类型。小数部分被截断,即 小数部分被丢弃。如果该值不能适合 目标类型,行为是不确定的(即使目标 类型是无符号的,模运算不适用)。如果 目标类型为bool,这是布尔转换(请参见下文)。
因此,您可以安全地将浮点类型(例如float
或double
)分配给整数。如果该值适合,则小数部分将被截断。这意味着数据丢失,并且可能是错误的来源,或者可能是在某些应用程序中故意这样做的。请注意,浮点类型的范围比int32_t
大,并且如果不能存储该值,则按照标准,它是未定义的行为。
另一方面,可以在所有情况下将布尔安全地分配给整数类型:
如果源类型为bool,则将值false转换为零,然后 值true转换为目标类型之一的值 (请注意,如果目标类型为int,则为整数 促销,而不是整数转换。
答案 1 :(得分:0)
您分配的值将转换为int32_t
。 bool
值不会丢失任何内容。 float
值将被截断。将仅存储其中的一部分。
如果是,除了更改struct成员数据类型外,我还应该做什么?
这取决于您要存储的值的类型是在运行时还是编译时确定的。如果在运行时确定,则可以使用std::any代替int32_t
:
#include <any>
struct MyStruct {
std::any val;
};
// ...
MyStruct s;
s.val = true; // val now contains a bool
s.val = 3.1415; // val now contains a double
s.val = 3.1415f; // val now contains a float
s.val = 42; // val now contains an int
如果类型是在编译时确定的,则可以制作一个结构模板:
template <typename T>
struct MyStruct {
T val;
};
// ...
MyStruct<bool> s1;
s1 = false;
MyStruct<float> s2;
s2 = 3.1415;