很奇怪,我发现在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上没有特殊操作。 那是什么原因造成的呢?为什么会这样?
答案 0 :(得分:2)
在AWK中,所有数字都以浮点形式存储。
对于所有这些函数,首先将双精度浮点值转换为最宽的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