将bool或float分配给int32_t安全吗?

时间:2019-04-18 20:05:25

标签: c++ int32

我有一个c++项目,该结构的成员数据类型为int32_t,并且我想为其分配boolfloat变量,这会破坏值变量?如果是,除了更改struct成员数据类型外,我还应该做什么?

2 个答案:

答案 0 :(得分:0)

每当编译器必须在需要其他类型的上下文中使用某个类型的值时,就会执行隐式转换。

隐式转换的规则为numerous,但在浮点-整数转换下,有以下段落:

  

浮点类型的prvalue可以转换为任何   整数类型。小数部分被截断,即   小数部分被丢弃。如果该值不能适合   目标类型,行为是不确定的(即使目标   类型是无符号的,模运算不适用)。如果   目标类型为bool,这是布尔转换(请参见下文)。

因此,您可以安全地将浮点类型(例如floatdouble)分配给整数。如果该值适合,则小数部分将被截断。这意味着数据丢失,并且可能是错误的来源,或者可能是在某些应用程序中故意这样做的。请注意,浮点类型的范围比int32_t大,并且如果不能存储该值,则按照标准,它是未定义的行为。

另一方面,可以在所有情况下将布尔安全地分配给整数类型:

  

如果源类型为bool,则将值false转换为零,然后   值true转换为目标类型之一的值   (请注意,如果目标类型为int,则为整数   促销,而不是整数转换。

答案 1 :(得分:0)

您分配的值将转换为int32_tbool值不会丢失任何内容。 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;