Dealing with numbers
Numbers are pretty easy to deal with in a ruby C extension. There are two possible types of Ruby numbers; FIXNUMs and Bignums. FIXNUMs are very fast since they just use the native long type of the architecture. However, due to some implementation details, the range of a FIXNUM is limited to one-half of the native long type. If larger (or smaller) numbers need to be manipulated, Bignums are full-blown ruby objects that can represent any number of any size, at a performance cost. The ruby C extension API has support for converting native integer types to ruby FIXNUMs and Bignums and vice-versa. Some of the functions are:
- INT2FIX(int) - take an int and convert it to a FIXNUM object (but see INT2NUM below)
- LONG2FIX(long) - synonym for INT2FIX
- CHR2FIX(char) - take an ASCII character (0x00-0xff) and convert it to a FIXNUM object
- INT2NUM(int) - take an int and convert it to a FIXNUM object if it will fit; otherwise, convert to a Bignum object. Since this does the right thing in all circumstances, this should always be used in place of INT2FIX
- LONG2NUM(long) - synonym for INT2NUM
- UINT2NUM(unsigned int) - take an unsigned int and convert it to a FIXNUM object if it will fit; otherwise, convert to a Bignum object
- ULONG2NUM(unsigned long int) - synonym for UINT2NUM
- LL2NUM(long long) - take a long long int and convert it to a FIXNUM object if it will fit; otherwise, convert to a Bignum object
- ULL2NUM(unsigned long long) - take an unsigned long long int and convert it to a FIXNUM object if it will fit; otherwise, convert to a Bignum object
- OFFT2NUM(off_t) - take an off_t and convert it to a FIXNUM object if it will fit; otherwise, convert to a Bignum object
- FIX2LONG(fixnum_object) - take a FIXNUM object and return the long representation (but see NUM2LONG below)
- FIX2ULONG(fixnum_object) - take a FIXNUM object and return the unsigned long representation (but see NUM2ULONG below)
- FIX2INT(fixnum_object) - take a FIXNUM object and return the int representation (but see NUM2INT below)
- FIX2UINT(fixnum_object) - take a FIXNUM object and return the unsigned int representation (but see NUM2UINT below)
- NUM2LONG(numeric_object) - take a FIXNUM or Bignum object in and return the long representation. Since this does the right thing in all circumstances, this should be used in favor of FIX2LONG
- NUM2ULONG(numeric_object) - take a FIXNUM or Bignum object in and return the unsigned long representation. Since this does the right thing in all circumstances, this should be used in favor of FIX2ULONG
- NUM2INT(numeric_object) - take a FIXNUM or Bignum object in and return the int representation. Since this does the right thing in all circumstances, this should be used in favor of FIX2INT
- NUM2UINT(numeric_object) - take a FIXNUM or Bignum object in and return the unsigned int representation. Since this does the right thing in all circumstances, this should be used in favor of FIX2UINT
- NUM2LL(numeric_object) - take a FIXNUM or Bignum object in and return the long long representation
- NUM2ULL(numeric_object) - take a FIXNUM or Bignum object in and return the unsigned long long representation
- NUM2OFFT(numeric_object) - take a FIXNUM or Bignum object in and return the off_t representation
- NUM2DBL(numeric_object) - take a FIXNUM or Bignum object in and return the double representation
- NUM2CHR(ruby_object) - take ruby_object in and return the char representation of the object. If ruby_object is a string, then the char of the first character in the string is returned. Otherwise, NUM2INT is run on the object and the result is returned