请帮助我理解printf
awk 中的逻辑。例如,-1 的 do 格式化输出 via %u
。
$ gawk --bignum 'BEGIN {printf "%u\n", -1}'
> 18446744073709551615
结果是通过区间 (0; 2^64 - 1) 的转换。我得出结论,无符号的整数值是在这个区间中定义的。因此,对于
$ 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)
。为什么会这样?
该文档描述了 limits,特别是针对 64 位有符号范围:
(不要忘记减号也占用空间 - 一点),以及对以下内容的评论
%u
:就在它下面:
awk
必须在GMP 支持下构建以支持大量。总而言之,文档描述了处理大数的必要条件,尽管您的问题的答案并不在于表面,而是实现的一个特性。