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