Целочисленный тип [Lua 5.3]

Целочисленный тип [Lua 5.3]

В 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

results for ""

    No results matching ""