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

时间:2014-12-02 13:07:06

标签: awk gawk

有人可以解释为什么2个不同的六进制转换为相同的小数吗?

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

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

2 个答案:

答案 0 :(得分:1)

GNU awk 4.1开始,您可以使用--bignum-M

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

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

§ Command-Line Options

答案 1 :(得分:0)

不是一个答案,而是一个解决方法,至少不能完全结合strtonum函数:

这似乎确实是双打。我在这里找到了计算:strtonum。 它没有错。

但是如果你真的需要在某个awk中使用它,你应该从hexa数字中删除最后一位数字,并在strtonum对其主要部分进行计算后手动添加。

所以0xA0000044956EA1,0xA0000044956EA2和0xA0000044956EA"无论什么"应该用一个简单的正则表达式变成0xA0000044956EA0然后添加"无论"。

编辑*也许我应该将这一切全部删除,因为我甚至要进一步降级。这也不是令人满意的,只是尝试了它,我实际上无法添加一个小到一个数字这个大的数字即打印(45035997424348832 + 4)刚出来45035997424348832.所以这个解决方法将不得不继续输出如45035997424348832 + 4 for hexa 0xA0000044956EA4。