BASH处理数字的能力是否随处理器位宽而扩展?

时间:2016-12-20 13:31:51

标签: bash

我最近不得不为BASH编写一个库来处理大量数据,因为我必须将一些需要基本算术的软件输出粘合在一起。如果我正在编写shell,我不会认为大多数人需要4096位算术。但是,我有两台机器都可以在BASH中处理高达64位的算术,但我的问题是它如何与CPU相关。

在32位处理器上,BASH的最大算术能力为32位,在16位处理器或具有一些OS和BASH的8位处理器上,最大数值能力为16位和8位分别?

BASH手册没有说明限制是什么。

1 个答案:

答案 0 :(得分:3)

Bash的内部算术是编译bash的目标的位宽,可能小于处理器的位宽&# 39;跑步具体来说,bash的内部算术是每this bug-report comment intmax_tintmax_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)