Главная » Статьи » Ruby » Более подробно о типах данных

Целые числа
Изначально числа представлены трёмя типами: два целых типа (классы Fixnum и Bignum) и один с плавающей запятой (класс Float). Возможно подключение дополнительных типов, например, комплексных и рациональных чисел, но пока ограничимся тремя.

Целые числа

Целые числа в Ruby не ограничены по величине, то есть могут хранить на сколько угодно большие значения. Для обеспечения такого волшебного свойства было создано два класса. Один из них хранит числа меньшие 2^31 (по модулю), а второй — всё, что больше. По сути, для больших чисел создаётся массив из маленьких, а раз массив не имеет ограничений по длине, то и число получается неограниченным по значению. 
А вот и неправда. Если, например, написать
puts 54308428790203478762340052723346983453487023489987231275412390872348475
**54308428790203478762340052723346983453487023489987231275412390872348475

то он начинает ругаться и выдаёт Infinity.
 
Как ни странно, 2^30 определяется как Bignum
(2**30).class
=> Bignum


Однако, целое число, меньшее (по модулю)2^30 определяется как Fixnum
((2**30)-1).class
=> Fixnum
(-(2**30)+1).class
=> Fixnum


Так-то!

Как только число типа Fixnum становится больше 2^31 (по модулю), то оно преобразуется к классу Bignum. Если число типа Bignum становится меньше 2^31, то оно преобразуется к типу Fixnum.

При записи целых чисел сначала указывается знак числа (знак + обычно не пишется). Далее идёт основание системы счисления, в которой задаётся число (если оно отлично от десятичной): 0 — для восьмеричной, 0x — для шестнадцатеричной, 0b — для двоичной. Затем идёт последовательность цифр, выражающих число в данной системе счисления. При записи чисел можно использовать символ подчёркивания, который игнорируется при обработке. Чтобы закрепить вышесказанное, посмотрим примеры целых чисел:
# тип Fixnum
123_456 # подчёркивание игнорируется
-567 # отрицательное число
0xbad # шестнадцатеричное число
0377 # восьмеричное
-0b101010 # отрицательное двоичное
0b0101_0101 # подчёркивание игнорируется
 
# тип Bignum
123_456_789_123_456 # подчёркивание игнорируется
-123_456_789_123_456 # отрицательное
07777777777777777777 # восьмеричное большое


Как видно из примеров, маленькие целые (Fixnum) и больши́е целые (Bignum) отличаются только значением.

Категория: Более подробно о типах данных | Добавил: Kostya (10.05.2009)
Просмотров: 1490 | Теги: целый тип, Bignum, Fixnum, целые числа, Ruby | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]