Как напечатать lld в Lua 5.3

string.format (formatstring, ···)

Возвращает отформатированную версию своего переменного числа аргументов в соответствии с описанием, приведенным в первом аргументе (который должен быть строкой). Строка формата соответствует тем же правилам, что и функция ISO C sprintf. Разница лишь в том, что опции / модификаторы *, h, L, l, n, and p не поддерживаются и что есть дополнительная опция, q,

Lua 5.3 не поддерживает lldкак я могу распечатать lld в Lua 5.3?

1 ответ

Решение

Краткий ответ: используйте %d,


В С sprintf, %lld используется для форматирования long long тип, который является целочисленным типом не менее 64 бит.

В Lua 5.3 тип number имеет два внутренних представления, целое и число с плавающей точкой. Целочисленное представление является 64-битным в стандартном Lua. Ты можешь использовать %d распечатать его независимо от его внутреннего представления:

print(string.format("%d", 2^62))

Выход: 4611686018427387904


В исходном файле Lua luaconf.hВидно, что Луа преобразует %d в подходящий формат:

#define LUA_INTEGER_FMT     "%" LUA_INTEGER_FRMLEN "d"

а также LUA_INTEGER_FRMLEN определяется как "", "l" или же "ll" если используется другое внутреннее представление для целого числа:

#if defined(LLONG_MAX)      /* { */
/* use ISO C99 stuff */
#define LUA_INTEGER     long long
#define LUA_INTEGER_FRMLEN  "ll"
//...
Другие вопросы по тегам