Вопрос по форматированному выводу в awk

Помогите, пожалуйста, разобраться с логикой printf в awk. Например, a делаю форматированный вывод для -1 через %u.

$ gawk --bignum 'BEGIN {printf "%u\n", -1}'
> 18446744073709551615

Результат - это переход через интервал (0; 2^64 - 1). Я делаю вывод, что целые значения для unsigned определены на этом интервале. Соответственно, для

$ gawk --bignum 'BEGIN {printf "%u\n", -9223372036854775808}'
> 9223372036854775808

всё работает. Но только перешагиваем через 2^63, всё "ломается"

$ gawk --bignum 'BEGIN {printf "%u\n", -9223372036854775809}'
> -9.22337e+18

т.е. %u перестаёт работать, выводится само число. Хотя, вроде, значение должно попадать в интервал (0; 2^64 - 1). Почему так происходит?


Ответы (1 шт):

Автор решения: 0andriy

В документации описаны пределы, конкретно для диапазона 64-битного знакового:

64-bit signed integer   -9,223,372,036,854,775,808  9,223,372,036,854,775,807

(не забываем, что минус тоже занимает место — один бит), а также комментарий к %u:

Print an unsigned decimal integer.
(This format is of marginal use, because all numbers in awk are floating point; it is provided primarily for compatibility with C.)

Там же чуть ниже:

NOTE: When using the integer format-control letters for values
that are outside the range of the widest C integer type, gawk switches to
the ‘%g’ format specifier. 

Для поддержки больших чисел awk должен быть собран с поддержкой GMP.

Поводя итоги, документация описывает необходимые условия для работы с большими числами, хотя ответ на ваш вопрос не лежит на поверхности, а скорее является особенностью имплементации.

→ Ссылка