Ruby Fixnums在 64 位 rubies 上是 64 位的:
bits = 8 * 0.size
# => 64
二进制补码下的最大有符号整数是9_223_372_036_854_775_807
,但 Ruby 中的最大 Fixnum 只有一半:
[(1 << 62) - 1, 1 << 62].map(&:class)
# => [Fixnum, Bignum]
max = (1 << 62) - 1
# => 4611686018427387903
max.to_s 2
# => "11111111111111111111111111111111111111111111111111111111111111" (62 bits)
Ruby 如何使用缺失的位?MRI Fixnum doc仅简要提及:
[Fixnum] 保存可以用本机机器字(减 1 位)表示的整数值。如果对 Fixnum 的任何操作超出此范围,则该值将自动转换为 Bignum。