【发布时间】:2016-08-08 22:41:41
【问题描述】:
我正在尝试使用符号、指数和尾数创建一个 IEEE754 浮点数,但我似乎无法让 ldexp() 函数在我的计算机上运行,所以我想知道是否有办法创建通过直接操作位的值来获得该数字。
【问题讨论】:
-
也许您应该问为什么不能使用
ldexp而不是尝试解决它。除非你的电脑很奇怪,否则使用 ldexp 应该没有问题。
我正在尝试使用符号、指数和尾数创建一个 IEEE754 浮点数,但我似乎无法让 ldexp() 函数在我的计算机上运行,所以我想知道是否有办法创建通过直接操作位的值来获得该数字。
【问题讨论】:
ldexp 而不是尝试解决它。除非你的电脑很奇怪,否则使用 ldexp 应该没有问题。
弄乱值表示的一个标准习惯用法是将您的位作为int 或char 数组的一部分,然后将memcpy() 放入您想要的类型。
请注意,通过写入 union 的一个字段并读取另一个字段或通过类型双关语(将指针从一种类型转换和取消引用到另一种类型,char* 除外)来完成您所要求的操作在技术上是未定义的行为C++ 标准,因此应该避免。众所周知,编译器会应用由于假设程序不执行这些行为而产生的优化,并且在执行时会导致意外行为。
对于此处考虑的指针转换的确切实例,Clang/LLVM 开发人员已在 a blog post 中发布,这是未定义的行为,他们可能会以意想不到的方式进行优化。
【讨论】:
offsetof 可能在某些实现中定义在库代码中,甚至可能使用如果用户代码包含它们显然会导致 UB 的构造(例如 arithmetic on a NULL pointer)。该标准只要求编译器使该构造按预期运行 - 它不要求模仿它的用户代码也能正常工作。