非常奇怪的是,我发现在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的源代码(从3021行开始,名为buildin.c,gawk 4.1.1,http://ftp.gnu.org/gnu/gawk/),但是我没有发现int的特殊操作。
那么,是什么原因造成的呢?为什么会这样呢?

最佳答案

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

Bitwise function:



假设使用IEEE-754,则double只能表示不超过253的整数。

关于c++ - AWK中的大整数只有53位吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24382014/

10-16 16:07