Trilhas
/
C#
C#
/
Programa
/
Overflow
Ov

Overflow em C#

1 exercício

Sobre Overflow

O exercício mostra o comportamento de vários tipos numéricos quando ocorre um estouro, ou seja, quando a capacidade deles é insuficiente para conter o valor resultante de um cálculo como uma operação aritmética ou uma conversão de tipo.

  • os números inteiros sem sinal (byte, ushort, uint, ulong) dão a volta para zero (o valor máximo do tipo + 1 funciona como um módulo), a menos que, de modo geral, apareçam dentro de um bloco checked, caso em que uma instância de OverflowException é lançada. int e long se comportam de forma semelhante, exceto que dão a volta para int.MinValue e long.minValue, respectivamente.
int one = 1;
checked
{
    int expr = int.MaxValue + one;  // overflow exception is thrown
}

// or

int expr2 = checked(int.MaxValue + one);  // overflow exception is thrown
  • Se uma expressão literal causar um estouro na variável à qual ela é atribuída, ocorre um erro em tempo de compilação.
  • o estado checked se aplica apenas a expressões diretamente no bloco. Estouros que ocorrem em funções chamadas não são capturados.
  • os tipos float e double assumem um estado de infinito que pode ser testado com float.IsInfinity(), etc.
double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
  • Números do tipo decimal fazem com que uma instância de OverflowException seja lançada.
  • Há uma palavra-chave unchecked correspondente para as circunstâncias em que você quer reverter o efeito de unchecked dentro de um bloco checked ou quando a configuração do compilador foi usada.

Estouros que ocorrem sem que uma exceção seja lançada podem ser problemáticos, porque em geral quanto mais cedo uma condição de erro puder ser relatada, melhor.

Problemas com estouros em int e float podem ser mitigados atribuindo o resultado a uma variável do tipo long, decimal ou double.

Se números inteiros grandes forem essenciais para o seu código, usar o tipo BigInteger é uma opção.

Naturalmente, há ocasiões em que é legítimo permitir que um número inteiro dê a volta, especialmente no caso de valores sem sinal. Um caso clássico é o dos códigos hash, que usam a largura do inteiro como uma espécie de módulo.

Em bases de código, você normalmente vai notar que muitas vezes não há verificação quando um uint ou um ulong é usado como identificador, porque se considera que isso dá mais trabalho do que vale a pena. O mesmo vale quando é evidente, pelo domínio, que não haverá valores muito grandes envolvidos. Mas dê uma olhada neste vídeo para conhecer uma história que serve de alerta.

Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Overflow