Qual é o valor máximo de uma variável numérica do bash shell?

17

Estou curioso para saber o que acontece quando uma variável numérica no bash é incrementada sem parar de propósito. Qual o tamanho do número? Transbordará e se tornará negativo e continuará a aumentar para sempre? Será que vai quebrar e derrapar até parar em algum momento?

Estou usando um processador AMD x86_64, mas ficaria feliz em ouvir respostas de 32 bits, apenas especifique sobre o que você está falando. Estou executando o Fedora21 64bit.

Eu pesquisei por toda parte, mas não encontrei esse boato específico por algum motivo estranho. Parece que seria uma informação básica em todos os manuais e tal.

Poder maximo
fonte
3
Como sobre a impressão de algumas potências de 2 como titular:for i in {0..70}; do echo 2 to the power of $i = $((2**i)); done
mpy
1
Se você deseja números grandes, pode mudar para kshqual é a aritmética de ponto flutuante, e não o número inteiro como bash: ksh -c 'echo $((2**1023))'8.98846567431157954e+307
jlliagre
Vou ter em mente o ksh se precisar de pontos ou valores flutuantes na estratosfera, o ponto flutuante pode ser bastante útil. Mas essa pergunta é simplesmente para que eu conheça os limites do meu sistema, não é porque preciso exceder seus limites. Farei algo como o mpy sugere, não comecei porque não queria correr o risco de causar uma falha no sistema.
Max Power

Respostas:

22

Pode ser a versão do bash, o sistema operacional e a arquitetura da CPU. Por que você não tenta você mesmo? Defina uma variável como (2 ^ 31) -1, aumente-a, defina-a como 2 ^ 32, aumente-a, defina-a como 2 ^ 64, aumente-a etc.

Aqui, eu apenas tentei no meu Mac Core i7 executando o OS X "El Capitan" v10.11.3, e parece que o bash está usando números inteiros de 64 bits assinados.

$ uname -a
Darwin Spiff.local 15.3.0 Kernel do Darwin Versão 15.3.0: Qui dez 10 18:40:58 PST 2015; raiz: xnu-3248.30.4 ~ 1 / RELEASE_X86_64 x86_64
$ bash --version
bash --versão
Lançamento do GNU bash, versão 3.2.57 (1) (x86_64-apple-darwin15)
Copyright (C) 2007 Fundação de Software Livre, Inc.
$
$ ((X = 2 ** 16)); eco $ X
65536 <- tudo bem, pelo menos UInt16
$ ((X = 2 ** 32)); eco $ X
4294967296 <- tudo bem, pelo menos UInt32
$ ((X = 2 ** 64)); eco $ X
0 <- opa, não UInt64
$ ((X = (2 ** 63) -1)); eco $ X
9223372036854775807 <- ok, pelo menos SInt64
$ ((X ++)); eco $ X
-9223372036854775808 <- estourou e empacotou negativo. Deve ser SInt64
Spiff
fonte
3

Eu montei um loop. while return status is 0 increment a variable with addition and print the variable to stdout Eu o iniciei com menos de 2 ^ 31, deixei passar 2 ^ 31 e 2 ^ 32 sem problemas, parei e, em seguida, defina o valor inicial para pouco menos de 2 ^ 63. O resultado foi que ele passou de 9.22e18 para -9.22e18 e continuou a aumentar positivamente. (em direção a zero)

Apenas para verificar se eu while [ $? -eq 0 ]estava realmente usando o status de saída dos comandos dentro do loop while, não usando o status de saída do script anterior ou algo estranho, eu também o executei com um comando extra dentro do loop projetado para criar uma saída diferente de zero status em incrementos específicos.

Por isso, ele é assinado, passará o mouse em vez de parar no valor máximo e o fará sem nenhuma mensagem de erro. Portanto, é possível terminar em um loop verdadeiramente infinito. Não limita o hardware de 64 bits e o SO Linux de 64 bits a um antigo padrão de 16 ou 32 bits.

Poder maximo
fonte
2

o bash usa inteiro de 64 bits. Portanto, se você aumentar após a variável atingir seu número máximo, a variável será excedida. Abaixo está o meu teste com int sem sinal e número inteiro assinado.

MAX_UINT = 18446744073709551615
MAX_INT = 9223372036854775807

$ printf "%llu\n" $((2**64))
0
$ printf "%llu\n" $((2**64-1))
18446744073709551615

$ printf "%lld\n" $((2**63-1))
9223372036854775807
$ printf "%lld\n" $((2**63))
-9223372036854775808
$ printf "%lld\n" $((2**64-1))
-1
PT Huynh
fonte
2
adicione um texto explicando como isso responde à pergunta. Parece que você está tentando demonstrar os limites superiores via código - você pode explicar por que esse código alcançará o resultado necessário?
Sir Adelaide