[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

我们可以通过以下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


你可能感兴趣的:(C++,c,C#,Ruby)