В Lua 5.3 появился отдельный целочисленный тип. В отличие от обычного double, диапазон целочисленных значений которого охватывает от -2^53 до 2^53, новый тип является 64-битным, поэтому можно хранить от -2^63 до (2^63 - 1).
Целочисленный тип полезен при работе с побитовыми операциями.
Вместе с этим появились новые функции:
math.maxinteger
— константа с максимальным значением, которое Lua может
представить целочисленнмым типом. math.maxinteger + 1 == max.mininteger
.math.mininteger
— то же, но для минимального значения.
math.mininteger - 1 == math.maxinteger
.math.tointeger(n: number)
— пытается преобразовать число или строку в
целочисленное значение. Если число не является целым или строка содержит не
целое число, то функция вернёт nil
.math.type(n: number)
— возвращает "integer"
для целочисленных значений,
"float"
для значений с плавающей точкой и nil
, если значение — не число.math.ult(a: number, b: number)
— беззнаковый аналог операции a < b
.-- Случается переполнение типа
print(math.mininteger, math.mininteger - 1)
print(math.maxinteger, math.maxinteger + 1)
for _, value in pairs {
5, -- "integer"
6.6, -- "float"
math.maxinteger, -- "integer"
-- Операция возведения в степень возвращает дробные числа
2^63 -- "float"
} do
print(math.type(value))
end
--[[ Число -1 в памяти хранится как
1111111111111111111111111111111111111111111111111111111111111111
Число 1 хранится как
0000000000000000000000000000000000000000000000000000000000000001
Оператор `<` учитывает знак, поэтому `-1 < 1` выведет `true`.
Но `math.ult` по определнию его игнорирует, потому
`math.ult(-1, 1)` выводит `false`.
]]
print(-1 < 1, math.ult(-1, 1))
-- Побитовые операции возвращают целочисленные значения
for _, value in pairs {(1 << 63) - 1,
0xffffffff >> 4,
0xf0f & 0x7ff,
0xfff000 | 0x000fff,
~1,
0xff00ff ~ 0x0f0f0f} do
print(value, math.type(value))
end