【发布时间】:2013-01-07 12:31:08
【问题描述】:
我不明白以下 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 意味着它是微软 C 编译器的代码路径)。
请注意,这些函数并非总是使用(取决于 CPU 架构),这是针对 little-endian(我解决了一些预处理器宏以简化)。
在线浏览镜像链接(代码来自LuaJIT项目): 环绕Header file(或whole project)。
感谢每一个提示。
【问题讨论】:
-
“我相当肯定原作者知道他在做什么”从来没有假设过。
-
别那么不信任......有些人已经赢得了被相信的权利,直到被证明是错误的;)(这是来自一个 JIT 编译器代码库,一个单人项目,目前我所知道的任何动态语言中最快的,所以...)
-
浮点数位模式的具体知识。阅读 Quake's InvSqrt 了解更多类似这样的脑筋急转弯代码。
标签: c double type-conversion low-level