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

C++ AWK中的大整数只有53位吗?,c++,linux,awk,bit-manipulation,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)

非常奇怪,我发现在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
32 lshift 48: 9007199254740992
429 lshift 48: 120752765008871424
<>但在C++中,其输出为:

32  lshift 48:   0   0
429     lshift 48:   3659174697238528    00001101000000000000000000000000000000000000000000000000
32 lshift 48: 9007199254740992
429 lshift 48: 120752765008871424
比较两个输出后,我发现awk只有53位, 然后我从名为builtin.c的文件中的第3021行开始研究了gawkstart的源代码,gawk 4.1.1,但是我发现在int上没有特殊的操作。
那么,这是什么原因呢?为什么会这样?

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

发件人:

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


假设使用IEEE-754,double只能表示253以下的整数。

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

发件人:

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


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

如果使用gawk,则需要为大数字添加-M选项

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

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

如果使用gawk,则需要为大数字添加-M选项

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

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

不,它不起作用。我的gawk/awk没有此选项。我的awk版本是GNU awk 3.1.5,你呢?在你的问题中,你提到你检查了gawk 4.1.1的代码。所以我用4.1.1进行了测试。如果您正在处理3.1.5,为什么要检查4.1.1的代码@心无多哈,对不起,这对我来说太愚蠢了!我将在我的机器上安装4.1.1。谢谢你的帮助!不,它不起作用。我的gawk/awk没有此选项。我的awk版本是GNU awk 3.1.5,你呢?在你的问题中,你提到你检查了gawk 4.1.1的代码。所以我用4.1.1进行了测试。如果您正在处理3.1.5,为什么要检查4.1.1的代码@心无多哈,对不起,这对我来说太愚蠢了!我将在我的机器上安装4.1.1。谢谢你的帮助!