1

最近,我读了一些长度为 16 的十六进制数据,比如0x1000 0000 0000 0000,但是当 print 0xffff ffff ffff ffff 时打印出一些奇怪的东西

awk '{printf("0x\n", 0x1000000000000000)}'  output `0x1000000000000000`  ok.

但是,取而代之的是

16 f awk '{printf("0x\n", 0xffffffffffffffff)}', 输出0

15 f awk '{printf("0x\n", 0xfffffffffffffff)}', 输出1000000000000000(14 0)

15 f awk '{printf("0x\n", 0xfffffffffffffff0)}', 输出0

14 f awk '{printf("0x\n", 0xffffffffffffff)}', 输出 100000000000000 (13 0)

14 f awk '{printf("0x\n", 0xffffffffffffff0)}', 输出 100000000000000 (14 0)

14 f awk '{printf("0x\n", 0xffffffffffffff00)}', 输出 0

13f awk '{printf("0x\n", 0xfffffffffffff)}',输出 fffffffffffff(13f)</p>

13f awk '{printf("0x\n", 0xfffffffffffff0)}',输出 fffffffffffff0(13f)</p>

13f awk '{printf("0x\n", 0xfffffffffffff00)}',输出 fffffffffffff00(13f)</p>

13f awk '{printf("0x\n", 0xfffffffffffff000)}',输出 fffffffffffff000(13f)</p>

所以 13f 没问题,如何打印 16f?

4

1 回答 1

1

您在printf()调用中缺少格式字符串。请注意,它的printf工作方式与print. 我假设您看到 awk 解释器的一些随机不稳定行为。

另一个典型的 awk 问题是它通常使用双精度浮点数来表示所有数值(也包括整数),因此当您接近 64 位时,您会失去精度并得到奇怪的伪影。这取决于实际的 awk 实现。

您可能会看到这两个问题的混合。我承认四舍五入到 0 很奇怪。

于 2013-07-16T21:58:03.727 回答