Ruby Fixnums在64位rubies上是64位的:
bits = 8 * 0.size
# => 64
two's complement下的最大有符号整数是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。