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.