gpt4 book ai didi

C "double to num"转换码 : why is it written like this?

转载 作者:行者123 更新时间:2023-12-02 05:33:42 26 4
gpt4 key购买 nike

我不明白下面的 C 转换函数是如何工作的(以及为什么要这样写);我相当确定原作者知道他在做什么:

typedef union TValue {
uint64_t u64;
double n;
struct {
uint32_t lo; /* Lower 32 bits of number. */
uint32_t hi; /* Upper 32 bits of number. */
} u32;
[...]
} TValue;


static int32_t num2bit(double n)
{
TValue o;
o.n = n + 6755399441055744.0; /* 2^52 + 2^51 */
return (int32_t)o.u32.lo;
}

static uint64_t num2u64(double n)
{
#ifdef _MSC_VER
if (n >= 9223372036854775808.0) /* They think it's a feature. */
return (uint64_t)(int64_t)(n - 18446744073709551616.0);
else
#endif
return (uint64_t)n;
}
  • num2bit 实际上只是将 double 转换为 int32_t 吗?为什么要加?为什么要这样写?
  • num2u64 中提到的这个“特征”是什么? (我相信 _MSC_VER 意味着它是 Microsoft C 编译器的代码路径)。

请注意,这些函数并非总是使用(取决于 CPU 架构),这是针对小端的(我解决了一些预处理器宏以简化)。

在线可浏览镜像链接(代码来自LuaJIT项目):周边Header file (或 whole project )。

感谢每一个提示。

最佳答案

num2bit 旨在实现 Lua BitOp semantics特别是wrt。模运算。实现定义的行为得到很好的控制,因为 LuaJIT 无论如何只适用于特定的 CPU、平台和编译器。不要在其他任何地方使用此代码。

num2u64 是 MSVC 的错误/错误功能的变通方法,它总是通过 int64_t 将 double 转换为 uint64_t。这不会为 >= 2^63 的数字提供所需的结果。 MS 认为这种可憎的行为是一种“特征”。呃。

关于C "double to num"转换码 : why is it written like this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14489698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com