Fixnum是实例可以内嵌在VALUE中的Ruby内置类之一.
[i]INT2FIX宏将C中的int数值转换成VALUE[/i]
能内嵌到VALUE中的数值(等同于Fixnum所表示的数值)的有效bit数至多为:
[b]sizeof(VALUE)*8-1[/b](否则数值的符号位会因左移而丢失).
而Fixnum是有符号的,故整数部分的bit数至多为:
[b]sizeof(VALUE)*8-2[/b](扣掉符号位).
[i]VALUE的值即是Ruby对象的ID[/i]
[img]/upload/attachment/125365/475684d9-f0a6-3ca4-95f3-1e685f5898b0.png[/img]
我们可以通过以下ruby程序"反推"出运行ruby的机器上VALUE的位数:
[i]INT2FIX宏将C中的int数值转换成VALUE[/i]
#define INT2FIX(i) ((VALUE)(((long)(i))<<1 | FIXNUM_FLAG))
#define FIXNUM_FLAG 0x01
(ruby.h)
能内嵌到VALUE中的数值(等同于Fixnum所表示的数值)的有效bit数至多为:
[b]sizeof(VALUE)*8-1[/b](否则数值的符号位会因左移而丢失).
而Fixnum是有符号的,故整数部分的bit数至多为:
[b]sizeof(VALUE)*8-2[/b](扣掉符号位).
[i]VALUE的值即是Ruby对象的ID[/i]
[img]/upload/attachment/125365/475684d9-f0a6-3ca4-95f3-1e685f5898b0.png[/img]
我们可以通过以下ruby程序"反推"出运行ruby的机器上VALUE的位数:
def size_of_VALUE
(1..16).each do |size|
return size if max_fixnum?(2**(size*8-2)-1)
end
raise "Bigger than 16!"
end
def fixnum?(num)
(num.object_id == 2*num+1) ? true : false
end
def max_fixnum?(num)
fixnum?(num)&&!fixnum?(num+1)
end
p size_of_VALUE