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.
for i in {0..70}; do echo 2 to the power of $i = $((2**i)); done
ksh
qual é a aritmética de ponto flutuante, e não o número inteiro comobash
:ksh -c 'echo $((2**1023))'
→8.98846567431157954e+307
Respostas:
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.
fonte
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.
fonte
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.
fonte