我最近不得不为BASH编写一个库来处理大量数据,因为我必须将一些需要基本算术的软件输出粘合在一起。如果我正在编写shell,我不会认为大多数人需要4096位算术。但是,我有两台机器都可以在BASH中处理高达64位的算术,但我的问题是它如何与CPU相关。
在32位处理器上,BASH的最大算术能力为32位,在16位处理器或具有一些OS和BASH的8位处理器上,最大数值能力为16位和8位分别?
BASH手册没有说明限制是什么。
答案 0 :(得分:3)
Bash的内部算术是编译bash的目标的位宽,可能小于处理器的位宽&# 39;跑步具体来说,bash的内部算术是每this bug-report comment intmax_t
。 intmax_t
类型为
有符号整数类型,能够表示任何有符号整数类型的任何值
per the docs,由编译器定义。因此,bash算法受编译环境的限制。即使在64位处理器上,为32位目标编译的bash版本也将限制为32位。
详情:在expr.c中,来源说
所有算术都是作为intmax_t整数完成的,没有检查溢出(尽管除以0并将其标记为错误)。
编辑这是一个针对位宽的运行时测试(我认为)仅依赖于bash被签名为2的补码。适用于我的系统 - YMMV。
#!/bin/bash
for((i=1; $i>0; i*=2)); do : ; done
# Set the highest-order bit, which is a negative number in signed math.
echo "$(echo "l(-($i))/l(2)"|bc -l)/1+1" | bc
# Output the position of that bit
内部bc -l
计算log2(|$i|)
,最高位的索引加上一点点,因为两个补码范围在零附近是不对称的。外bc
计算该值的上限。 (bc
在没有-l
的情况下运行时会截断分割 - 感谢this answer)。在我的系统上,这会输出64
。
经验测试:
~$ uname -a --- NOTE: 64-bit Cygwin vvvvvv
CYGWIN_NT-6.3 localhost 2.5.2(0.297/5/3) 2016-06-23 14:29 x86_64 Cygwin
~$ bash --version
GNU bash, version 4.3.46(6)-release (x86_64-unknown-cygwin)
<cut> --- NOTE: 64-bit bash ^^^^^^
~$ echo $(( 2 ** 32 ))
4294967296 <--- so >32 bit
~$ echo $(( 2 ** 64 ))
0 <--- oops - bigger than 64 bit doesn't work
~$ echo $(( 2 ** 63 ))
-9223372036854775808 <--- but 64 bit does (and is signed)