Esta página também está disponível em outros 2 idiomas.

unsigned int

[Data Types]

Descrição

No UNO e outras placas baseadas nos microcontroladores ATmega, unsigned ints (inteiros sem sinal) são o mesmo que o tipo int no que esses também armazenam um valor de 2 bytes. Em vez de guardar números negativos, no entanto, esses apenas armazenam valores positivos, garantindo um intervalo útil de 0 a 65,535 ((2^16) - 1).

O Due e outras placas ARM armazenam um unsigned int em 4 bytes (32 bits), de 0 a 4,294,967,295 (2^32 - 1).

A diferença entre unsigned ints e ints (com sinal), está na forma como o bit mais significativo, as vezes chamado de o bit "de sinal", é interpretado. No tipo int do Arduino (que possui sinal), se o bit mais significativo é "1", o número é interpretado como um número negativo, e os outros 15 bits são interpretados com (complemento de 2).

Sintaxe

unsigned int var = val;

Parâmetros

var: nome da variável
val: valor a ser atribuído à variável

Código de Exemplo

O trecho de código abaixo cria uma variável unsigned int chamada ledPin e a atribui o valor 13.

unsigned int ledPin = 13;

Notas e Advertências

Quando variáveis unsigned tem sua capacidade máxima excedida, elas "estouram" e voltam para 0, e também o contrário. Exemplo:

unsigned int x;
x = 0;
x = x - 1;  // x agora contém 65535
x = x + 1;  // x agora contém 0

A matemática com variávies unsigned pode produzir resultados inesperados, mesmo se a variável unsigned nunca estourar.

O microcontrolador aplica as seguintes regras:

O cálculo é feito de acordo com a variável de destino. Exemplo, se a variável destino possui sinal, ele irá realizar o cálculo levando em conta o sinal, mesmo que ambas as variáveis de entrada sejam unsigned.

No entanto, em um cálculo que requer um resultado intermediário, o escopo da variável intermediária não é especificado pelo código. Nesse caso, o micro irá usar matemática sem sinal para o resultado intermediário, porque ambas as entradas são unsigned!

unsigned int x = 5;
unsigned int y = 10;
int resultado;

resultado = x - y;  // 5 - 10 = -5, como esperado
resultado = (x - y) / 2;  // 5 - 10 com matemática unsigned é 65530!  65530/2 = 32765

// solução: usar variáveis com sinal, ou fazer o cálculo passo a passo.
resultado = x - y;  // 5 - 10 = -5, como esperado
resultado = resultado / 2;  //  -5/2 = -2 (matemática inteira, casas decimais não são consideradas)

Então porque usar variáveis sem sinal?

  • Quando o comportamento de estouro é desejado, ex. contadores

  • A variável com sinal é muito pequena, e se quer evitar a perda de memória e performance de long/float.

Ver Também