次の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プロジェクトからのものです):サラウンドヘッダーファイル(またはプロジェクト全体)。
すべてのヒントをいただければ幸いです。