Integer Overflow: Guia Completo com Exemplos
Overflow de inteiro derrubou o Ariane 5 e continua causando bugs silenciosos no seu codigo. Veja como cada linguagem lida com isso e o que fazer pra se proteger.
Carregando
Overflow de inteiro derrubou o Ariane 5 e continua causando bugs silenciosos no seu codigo. Veja como cada linguagem lida com isso e o que fazer pra se proteger.
Integer Overflow: Guia Completo com Exemplos. Overflow de inteiro derrubou o Ariane 5 e continua causando bugs silenciosos no seu codigo. Veja como cada linguagem lida com isso e o que fazer pra se proteger.
Overflow de inteiro acontece quando uma operacao matematica produz um resultado que nao cabe no espaco reservado pra aquele tipo numerico. Imagina um velocimetro de carro que vai ate 999 km/h. Se voce tentar mostrar 1000, o que acontece? Depende do sistema. Alguns voltam pra 0. Outros mostram lixo. Outros travam.
Em computacao, cada tipo numerico tem um tamanho fixo. Um inteiro de 16 bits armazena valores de -32.768 ate 32.767. Se voce tentar guardar 32.768, o valor 'da a volta' e vira -32.768. Isso e exatamente o que aconteceu no Ariane 5 — o sistema de navegacao converteu um float de 64 bits pra int de 16 bits, o valor estourou o limite, e o foguete interpretou o numero absurdo como uma correcao de trajetoria legitima.
O perigo do overflow e que ele e silencioso. Na maioria das linguagens, nao lanca excecao. O programa continua rodando com dados corrompidos. E bugs de dados corrompidos sao os mais dificeis de debugar porque tudo parece funcionar — ate que nao funciona.
JavaScript nao tem tipo inteiro. Todo numero e um IEEE 754 double-precision float de 64 bits. Isso significa que JS consegue representar numeros inteiros com precisao ate 2^53 - 1, que e o famoso Number.MAX_SAFE_INTEGER (9.007.199.254.740.991). Acima disso, JS comeca a pular numeros.
Percebe o problema? JS nao lanca erro. Ele simplesmente arredonda pro numero representavel mais proximo. Se voce ta somando valores financeiros, calculando IDs sequenciais ou comparando timestamps em nanosegundos, isso e uma bomba-relogio.
A solucao no JavaScript moderno e o BigInt, introduzido no ES2020. BigInt lida com inteiros de tamanho arbitrario — nao tem limite. Mas tem pegadinhas.
BigInt resolve o overflow, mas cria novos problemas: nao funciona com Math.max(), nao serializa direto em JSON, e nao pode ser misturado com Number em operacoes. Na pratica, voce precisa decidir na arquitetura do projeto onde vai usar BigInt e manter a consistencia.
Python e a linguagem que mais protege o dev contra overflow — pelo menos no int nativo. O int do Python tem precisao arbitraria. Nao tem limite. Voce pode multiplicar numeros gigantescos e o Python aloca mais memoria conforme necessario.
Ate aqui, tudo lindo. Mas o perigo mora no NumPy. Quando voce usa NumPy, os inteiros voltam a ter tamanho fixo — e o overflow volta a ser silencioso.
Se voce trabalha com data science ou machine learning, presta atencao nisso. NumPy por padrao nao avisa sobre overflow. Voce vai achar que ta calculando metricas corretas, mas um unico overflow silencioso pode corromper todo o pipeline de dados. Use np.errstate(over='raise') nos pontos criticos.
TypeScript compila pra JavaScript, entao herda todos os problemas do JS com numeros. O tipo number do TS e o mesmo IEEE 754 double do JS. Nao tem int nativo. Mas TypeScript te da uma vantagem: voce pode criar tipos que te forcam a pensar sobre overflow.
Ja em C e C++, overflow de inteiro com sinal e undefined behavior — o compilador pode fazer literalmente qualquer coisa. Incluindo otimizar fora o seu check de overflow se ele achar que 'nao deveria acontecer'. Nao e piada.
Se voce programa em Rust, tem sorte: o compilador checa overflow em modo debug e faz wrap em release. Voce pode usar checked_add(), saturating_add() ou wrapping_add() pra ter controle explicito. Outras linguagens como Swift tambem lancam erro em overflow por padrao.