名前ちゃんとするか
void* がdoubleと同じくらい大きい環境だとtrue.object_idは20になるっぽい。見た感じFixnumと同じノリで小さめの値はVALUEに直接突っ込んでそう https://github.com/ruby/ruby/blob/9e41a75255d15765648279629fd3134cae076398/include/ruby/internal/special_consts.h#L78
doubleを62bitに削るのどうやるんだろうと思ったら、上位3ビットが011か100のときだけ決め打ちで復元する前提で先頭2ビットを落としてるのか。なんでこのパターンなんだろう https://github.com/ruby/ruby/blob/1035a3b202ee86bf2b0a1d00eefcfff0d7ab9f6b/internal/numeric.h#L234
いや違うわ、3ビットローテートしてるから符号ビットだけ保存してexponentの先頭2ビットを消し飛ばしてるのか。復元するときは符号ビットに応じて00か11を埋めるから、結局Fixnumと同じで小さめの値を埋め込んでる
で、Float埋め込みの関係上、今までは即値フラグの1ビットだけをVALUEの下位ビットに持たせとけば良かったのが整数かFloatかの区別のためもう1ビット必要になったから、0x02にいたQtrueが空いてるところに動かされて0x14になったという話ですね