将十六进制转换为十进制时awk的奇怪行为

将十六进制转换为十进制时awk的奇怪行为,awk,gawk,Awk,Gawk,有人能解释为什么两个不同的十六进制转换成同一个十进制吗 $ echo A0000044956EA2 | gawk '{print strtonum("0x" $1)}' 45035997424348832 $ echo A0000044956EA0 | gawk '{print strtonum("0x" $1)}' 45035997424348832 这并不是一个答案,而是一个解决方案,至少可以避免将strtonum函数完全装箱: 看起来确实是双打。我在这里找到了计算结果:。 没什么问题

有人能解释为什么两个不同的十六进制转换成同一个十进制吗

$ echo A0000044956EA2 | gawk '{print strtonum("0x" $1)}'
45035997424348832

$ echo A0000044956EA0 | gawk '{print strtonum("0x" $1)}'
45035997424348832

这并不是一个答案,而是一个解决方案,至少可以避免将strtonum函数完全装箱:

看起来确实是双打。我在这里找到了计算结果:。 没什么问题

但是,如果您在某些awk中确实需要这个,您应该从十六进制数中去掉最后一个数字,并在strtonum对其主要部分进行计算后手动添加它

所以0xA0000044956EA1、0xA0000044956EA2和0xA0000044956EA“whatever”都应该使用简单的正则表达式变成0xA0000044956EA0,然后添加“whatever”

编辑*也许我应该删除这一切,因为我甚至降级这更进一步。这也不能令人满意,只是尝试了一下,我实际上无法将这么小的数字添加到这么大的数字上,即打印(45035997424348832+4)结果为45035997424348832。因此,对于hexa 0xA0000044956EA4,此解决方案必须保持输出为45035997424348832+4。

从开始,您可以使用
--bignum
-M

$ awk -M 'BEGIN {print 0xA0000044956EA2}'
45035997424348834

$ awk -M 'BEGIN {print 0xA0000044956EA0}'
45035997424348832

echo a000044956ea5 | gawk'{print strotnum(“0x”$1)}
45035997424348840作为此处的输出。正如信息点一样,
A0
A5
之间的所有内容都给出了
..32
输出。@Jidder:我不这么认为,因为结果是正确的(对于a000044956ea0)@Jidder:请参见
echo a000044956ea5 | gawk'{print strotum(“0x”$1)}45035997424348840
。似乎在一些数字之后,它总是转换成八进制整数。参见示例a0000044956e0a a0000044956e0ba0000044956e0c@EranBen-Natan我注意到,因此我删除了评论,我认为这可能是因为现在四舍五入(可能)。您可能需要选择一种具有更好的大数字支持的语言:
ruby-e'put“a000044956ea1”。to_i(16)
outputs
45035997424348833