Skip to content

Latest commit

 

History

History
44 lines (32 loc) · 1.63 KB

File metadata and controls

44 lines (32 loc) · 1.63 KB
layout
title description tableOfContents outline pagination
visible
true
visible
visible
true
visible
true
visible
true

Estouro com Inteiros sem Sinal

A aritmética sem sinal em C ignora o estouro; ela produz o resultado real módulo a enésima potência de 2, onde n é o número de bits no tipo de dado. Dizemos que ela “trunca” o resultado verdadeiro para os n bits mais baixos.

{% hint style="info" %} No parágrafo acima, a palavra módulo significa o operador matemático de cálculo do resto, que em C é representado pelo caractere %. A expressão neste caso poderia ser representada por resultado_real % pow(2, 32), para um inteiro de 32 bits. {% endhint %}

Um resultado real que é negativo, quando tomado módulo a enésima potência de 2, gera um número positivo. Por exemplo,

unsigned int x = 1;
unsigned int y;

y = -x;

causa estouro porque o número negativo -1 não pode ser armazenado em um tipo sem sinal. O resultado real, que é -1 módulo a enésima potência de 2, é um a menos que a enésima potência de 2. Esse é o maior valor que o tipo de dado sem sinal pode armazenar. Para um unsigned int de 32 bits, o valor é 4.294.967.295. Veja Valores Máximos e Mínimos1.

Adicionar esse número a si mesmo, como aqui,

unsigned int z;

z = y + y;

deveria gerar 8.489.934.590; no entanto, isso novamente é grande demais para caber, então o estouro trunca o valor para 4.294.967.294. Se fosse um inteiro com sinal, isso significaria -2, o que (não por coincidência) é igual a -1 + -1.

Footnotes

  1. Capítulo pendente de tradução