Detectar interger overflow [RESOLVIDO]

1. Detectar interger overflow [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 05/09/2015 - 08:26h

Como eu posso detectar quando um valor ultrapassa a capacidade do tipo int?
É que estou trabalhado num programa que gera combinações na casa das centenas de milhões, e as vezes dá um erro devido a algumas vezes ter de calcular mais de 4 bilhões de combinações.




  


2. MELHOR RESPOSTA

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 05/09/2015 - 13:08h

#include <limits.h>


int numeroAbsurdo = 42847391;

if (numeroAbsurdo > INT_MAX)
printf("Ultrapassou o limite int");

3. Re: Detectar interger overflow [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/09/2015 - 23:11h

uilianries escreveu:

#include <limits.h>


int numeroAbsurdo = 42847391;

if (numeroAbsurdo > INT_MAX)
printf("Ultrapassou o limite int");


Concorda que, por definição, uma comparação de qualquer int com INT_MAX vai resultar sempre em menor ou igual?


Se os operandos forem de um tipo inteiro menor do que a largura máxima suportada pela plataforma (por exemplo, int32_t numa plataforma que aceita números de 64 bits), o problema está resolvido. Basta operar com a precisão maior e comparar com o valor máximo da precisão menor. Por exemplo:

#include <limits.h>
#include <stdint.h>

int32_t f(int32_t x, int32_t y){
int64_t result=(int64_t)x+(int64_t)y;
errno=0;
if(result>INT32_MAX)
return (int32_t)result;
errno=ERANGE;
return -1;
}


Outra abordagem é usar operação de soma (ou subtração) diretamente em Assembly, e verificar o flag de carry após a operação.

Ainda outra possibilidade, tratando-se de soma, é comparar a soma com as parcelas: em condições normais, a soma de dois números naturais nunca pode ser menor do que cada uma das parcelas. Se se trabalhar com números negativos ou outras operações, como multiplicação ou exponenciação, os testes serão menos triviais.


4. Re: Detectar interger overflow [RESOLVIDO]

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 06/09/2015 - 10:37h

Paulo, tu tens razão.

Válidar INT_MAX com int é limitado/incorreto.

Lembrei disso ontem e acabei por não comentar. Acredito que o jeito mais simplista seria utilizar uma variável de tamanho maior (long long) para a comparação.


5. Re: Detectar interger overflow [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/09/2015 - 12:34h

Sei que pode parecer dor de cotovelo, mas eu realmente não consigo entender que se marque como melhor resposta uma mensagem cujo próprio autor reconhece como incorreta.


6. Re: Detectar interger overflow [RESOLVIDO]

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 08/09/2015 - 12:48h


Pela sinceridade.

Brincadeira a parte,

concordo que a melhor resposta deve ser a do Paulo. Uma vez que além me corrigir ele deu a solução e também explicou a base.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts