Manual da Linguagem GNU C
Doar para o tradutorDoar para os autores
  • Linguagem GNU C
  • Prefácio
  • 1️1. O Primeiro Exemplo
    • Fibonacci Recursiva
      • Cabeçalho da Função
      • Corpo da Função
    • Pilha e Estouro de Pilha
    • Fibonacci Iterativa
  • 📦2. Um Programa Completo
    • Exemplo de um Programa Completo
    • Explicação do Programa Completo
    • Programa Completo Linha por Linha
    • Compilando o Programa de Exemplo
  • 👜3. Armazenamento e Dados
  • 🥑4. Além dos Inteiros
    • Um Exemplo com Números Não Inteiros
    • Um Exemplo com Arrays
    • Variações para o Exemplo com Array
  • ✍️5. Sintaxe Lexical
    • Escreva Programas em Inglês!
    • Caracteres
    • Espaços em Branco
    • Comentários
    • Identificadores
    • Operadores e Pontuação
    • Continuação de Linha
  • ➕6. Aritmética
    • Aritmética Básica
    • Aritmética de Inteiros
    • Estouro de Inteiros
      • Estouro de Inteiros sem Sinal
      • Estouro de Inteiros com Sinal
    • Aritmética em Modo Misto
    • Divisão e Resto
    • Comparações Numéricas
    • Operações de Deslocamento
      • Deslocar Gera Novos Bits
      • Advertências em Operações de Deslocamento
      • Hacks com Deslocamento
    • Operações Bit-a-bit
  • 🟰7. Expressões de Atribuição
    • Atribuição Simples
    • Lvalues
    • Atribuição Modificadora
    • Operadores de Incremento e Decremento
    • Pós-incremento e Pós-decremento
    • Armadilha: Atribuição em Subexpressões
    • Escreva Atribuições em Instruções Separadas
  • 🕹️8. Expressões de Controle de Execução
    • Operadores Lógicos
    • Operadores Lógicos e Comparações
    • Operadores Lógicos e Atribuições
    • Expressão Condicional
    • Operador Vírgula
  • 🐫9. Gramática dos Operadores Binários
  • 🏁10. Ordem de Execução
    • Reordenação de Operandos
    • Associatividade e Ordenação
    • Pontos de Sequência
    • Pós-incremento e Ordenação
    • Ordenação de Operandos
    • Otimização e Ordenação
  • 🎲11. Tipos Primitivos
    • Tipos de Dados Inteiros
      • Inteiros Básicos
      • Tipos Com ou Sem Sinal
      • Inteiros Estreitos
      • Conversão entre Tipos Inteiros
      • Tipo Booleano
      • Variações de Inteiros
    • Tipos de Dados de Ponto Flutuante
    • Tipos de Dados Complexos
    • O Tipo Void
    • Outros Tipos de Dados
    • Designadores de Tipos
  • 🪨12. Constantes
    • Constantes do Tipo Inteiro
    • Tipos de Dados de Constantes do Tipo Inteiro
    • Constantes de Ponto Flutuante
    • Constantes de Números Imaginários
    • Constantes de Caracteres
    • Constantes do Tipo String
    • Constantes do Tipo String UTF-8
    • Códigos de Caracteres Unicode
    • Constantes do Tipo Caractere Largo
    • Constantes do Tipo String Larga
  • 📐13. Tamanho de Tipo
  • Apêndices
    • F - GNU Free Documentation License
    • G - GNU General Public License
Fornecido por GitBook
Nesta página

Isto foi útil?

Editar no GitHub
Exportar como PDF
  1. 6. Aritmética

Aritmética de Inteiros

AnteriorAritmética BásicaPróximoEstouro de Inteiros

Atualizado há 8 meses

Isto foi útil?

Cada uma das operações aritméticas básicas em C tem duas variantes para inteiros: com e sem sinal. A escolha é determinada pelos tipos de dados de seus operandos.

Cada tipo de dado inteiro em C é ou signed (com sinal) ou unsigned (sem sinal). Um tipo com sinal pode conter um intervalo de números positivos e negativos, com o zero próximo ao meio do intervalo. Um tipo sem sinal pode conter apenas números não negativos; seu intervalo começa em zero e vai para cima.

Os tipos inteiros mais básicos são int, que normalmente pode conter números de -2.147.483.648 a 2.147.483.647, e o unsigned int, que normalmente pode conter números de 0 a 4.294.967.295. (Isso assume que int tem 32 bits de largura, o que é sempre verdadeiro para GNU C em computadores reais, mas nem sempre em controladores embarcados.) Veja , para informações completas sobre tipos inteiros.

Quando uma operação aritmética básica recebe dois operandos com sinal, ela realiza aritmética com sinal. Quando recebe dois operandos sem sinal, realiza aritmética sem sinal.

Se um operando for unsigned int e o outro int, o operador trata ambos como sem sinal. De maneira mais geral, o tipo comum dos operandos determina se a operação é sinalizada ou não. .

Imprimir os resultados de uma aritmética sem sinal com printf usando ‘%d’ pode produzir resultados surpreendentes para valores distantes de zero. Mesmo que as regras acima digam que a computação foi feita com aritmética sem sinal, o resultado impresso na tela pode parecer com sinal!

A explicação é que o padrão de bits resultante de uma adição, subtração ou multiplicação é, na verdade, o mesmo para operações com e sem sinal. A diferença está apenas no tipo de dado do resultado, que afeta a interpretação do padrão de bits resultante e se a operação aritmética pode ou não causar um estouro (veja a próxima seção).

Mas ‘%d’ não sabe o tipo de dado de seu argumento. Ele vê apenas o padrão de bits do valor e está definido para interpretá-lo como signed int. Para imprimi-lo como sem sinal, é necessário usar ‘%u’ em vez de ‘%d’. Veja no The GNU C Library Reference Manual (disponível somente em inglês).

A aritmética em C nunca opera diretamente em tipos inteiros estreitos (aqueles com menos bits que int; veja ). Em vez disso, ela os "promove" para int. Veja .

➕
The GNU C Library