【问题标题】:Is it safe to assign bool or float to int32_t?将 bool 或 float 分配给 int32_t 是否安全?
【发布时间】:2019-09-09 04:56:23
【问题描述】:

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

【问题讨论】:

  • 这取决于你所说的“安全”是什么意思,float 将被截断为int,但这取决于你是否安全。
  • 你绝对可以convert bool to int32_t and float to int32_t 但不同的是第二次转换会导致数据丢失这是程序缺陷.
  • 如果你的float值是1.234,当你把它赋值给一个只能存储整数值的int时,你期望会发生什么?

标签: c++ int32


【解决方案1】:

您分配的值将转换为int32_tbool 值不会丢失任何内容。 float 值将被截断。只会存储其中不可分割的部分。

如果是,除了改变结构成员数据类型,我应该怎么做?

这取决于您要存储的值的类型是在运行时还是编译时确定的。如果在运行时确定,您可以使用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

如果类型是在编译时确定的,你可以制作一个struct模板:

template <typename T>
struct MyStruct {
    T val;
};

// ...

MyStruct<bool> s1;
s1 = false;

MyStruct<float> s2;
s2 = 3.1415;

【讨论】:

    【解决方案2】:

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

    隐式转换的规则是numerous,但是在Floating--integral转换下,有如下一段:

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

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

    另一方面,布尔值在任何情况下都可以安全地分配给整数类型:

    如果源类型为 bool,则值 false 被转换为零并且 值 true 转换为目标类型的值之一 (请注意,如果目标类型是 int,则这是一个整数 提升,而不是整数转换)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-12
      • 2012-06-02
      • 1970-01-01
      • 2011-12-15
      • 2010-10-24
      • 2016-01-27
      • 1970-01-01
      • 2016-04-26
      相关资源
      最近更新 更多