【问题标题】:How convert constant float value to 4 bytes hex constant value in compile time?如何在编译时将常量浮点值转换为 4 字节十六进制常量值?
【发布时间】:2019-09-08 03:12:19
【问题描述】:

如何在编译时将常量浮点值转换为十六进制?

在运行时我这样做:

int main()
{
    union float_to_int
    {
        float                           float_;
        int                             int_;
    };

    printf("43.2 in hex: 0x%X.\n", float_to_int{ 43.2f }.int_);

    return 0;
}

如何在编译时做到这一点?我完全迷路了

【问题讨论】:

  • 请注意您的代码是未定义的行为。

标签: c++ c++14 c++17 compile-time-constant


【解决方案1】:

从广义上讲……你不知道。您可能用来完成此操作的任何机制都会调用 UB(您发布的那个肯定会调用),并且编译时代码中的任何 UB 都被明确定义为格式错误。

好吧,直到 C++20 将 add std::bit_cast,这个函数可以通过在它们之间进行等效的字节复制来转换可简单复制的类型。它被定义为constexpr(只要源和目标类型适合该操作),因此您可以在编译时进行这些转换。

【讨论】:

  • 那是如何实现的?类型双关语?
  • @Red.Wave:类型双关语是指将一块内存用作两个不同的对象。 bit_cast 返回一个新对象,一个与给定对象没有内存重叠的prvalue。此外,标准库在法定货币上运行;它做了它所做的,因为标准说它做了。它不需要是你可以自己实现的东西。
  • 图书馆过去与关键字不同。至少从某种意义上说,库将在语言内部实现(“std::type_info”除外)。看起来从“std::initializer_list”开始,一切都在库中找到了自己的方式,而不是关键字集。如果我们现在不停止,'namespace std' 将疯狂地充满魔法类型的丛林。关于双关,是什么阻止函数返回双关对象的副本?(所以实现是 type_punning 深入,但按值返回)
  • @Red.Wave: "除了'std::type_info'" 所以你承认有先例,因此库从来没有真正“与关键字不同”。 “是什么阻止了函数返回 punned 对象的副本?” 这没有意义。您本身并没有双关语;你双关一个内存地址。返回对象的对象表示形式的副本与双关语对象不同。
猜你喜欢
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多