AWK中的大整数只有53位吗?

时间:2014-06-24 08:40:32

标签: c++ linux awk bit-manipulation

很奇怪,我发现在awk中,大整数看起来只有53位。这是我的榜样:

function bits2str(bits,data, mask)
{
    if (bits == 0)
        return "0"

    mask = 1
    for (; bits != 0; bits = rshift(bits, 1))
        data = (and(bits, mask) ? "1" : "0") data

    while ((length(data) % 8) != 0)
        data = "0" data

    return data
}

BEGIN{
    print 32,"\tlshift 48:\t", lshift(32,48), "\t", bits2str(lshift(32,48))
    print 429,"\tlshift 48:\t", lshift(429,48), "\t", bits2str(lshift(429,48))
}

,输出为:

32  lshift 48:   0   0
429     lshift 48:   3659174697238528    00001101000000000000000000000000000000000000000000000000

但是在c ++中,它的输出是:

32 lshift 48: 9007199254740992
429 lshift 48: 120752765008871424

比较两个输出后,我发现awk只有53位, 然后我研究了gawk的源代码(从名为builtin.c的文件中的第3021行开始,gawk 4.1.1,http://ftp.gnu.org/gnu/gawk/),但我发现int上没有特殊操作。 那是什么原因造成的呢?为什么会这样?

2 个答案:

答案 0 :(得分:2)

在AWK中,所有数字都以浮点形式存储。

来自Bitwise function

  

对于所有这些函数,首先将双精度浮点值转换为最宽的C无符号整数类型,然后执行按位运算。如果结果不能完全表示为C double,则逐个删除前导非零位,直到可以精确表示。然后将结果转换回C double。

假设使用IEEE-754,double s只能表示最多2 53 的整数。

答案 1 :(得分:2)

如果您使用gawk,则需要为大号添加-M选项。

kent$ awk 'BEGIN{print lshift(32,48)}'
0

kent$ awk -M 'BEGIN{print lshift(32,48)}'
9007199254740992