Linguagem C: os tipos de dados

Os dados manipulados em linguagem C são tipados, ou seja, para cada dado usado (nas variáveis, por exemplo) é preciso especificar o tipo de dado, o que permite conhecer a quantidade de memória (o número de bytes) ocupada pelos dados, assim como a sua representação.

Vamos iniciar esse artigo compreendendo os conceitos fundamentais da linguagem C:

  • Números: inteiros (int) ou reais, ou seja, com vírgulas (float).
  • Ponteiros (pointers): usados para armazenar o endereço de outros dados, ‘apontam’ para outro dado.

Na linguagem C, existem vários tipos inteiros dependendo do número de bytes em que são codificados, bem como do seu formato, ou seja, se eles são assinados (com o sinal - ou +) ou não. Por padrão, os dados são assinados.

Tipos de dados

Veja essa tabela com os tipos de dados em linguagem C:

Tipo de dado Significado Tamanho (em bytes) Intervalo de valores aceitos
char Caractere 1 de -128 a 127
unsigned char Caractere não assinado 1 0 a 255
short int Inteiro curto 2 de -32.768 a 32.767
unsigned short int Inteiro curto não assinado 2 de 0 a 65.535
int Inteiro 2 (16 bits)
4 (32 bits)
de -32.768 a 32.767
de -2.147.483.648 a 2.147.483.647
unsigned int Inteiro não assinado 2 (16 bits)
4 (32 bits)
de 0 a 65.535
de 0 a 4.294.967.295
long int Inteiro longo 4 de -2.147.483.648 a 2.147.483.647
unsigned long int Inteiro longo não assinado 4 de 0 a 4.294.967.295
float Flutuante (real) 4 3.4*10-38 a 3.4*1038
duplo Flutuante duplo 8 de 1.7*10-308 a 1.7*10308
longo duplo Flutuante duplo longo 10 3.4*10-4932 a 3.4*104932

Número inteiro (int)

Um número inteiro é um número sem vírgula, que pode ser expresso em diferentes bases:

  • Base decimal: o número inteiro é representado por uma sequência de números unitários (de 0 a 9), que não deve começar por 0.
  • Base hexadecimal: o número inteiro é representado por uma sequência de números unitários (de 0 a 9 ou de A a F - ou a a f), começando por 0x ou 0X.
  • Base octal: o número inteiro é representado por uma sequência de números unitários (incluindo apenas números de 0 a 7), começando com 0.

Os inteiros são assinados por padrão, o que significa que eles têm um sinal. Para armazenar informações sobre o sinal (em binário), os computadores usam o complemento a dois.

Número com vírgula (float)

Um número com vírgula flutuante é um número com vírgula, porém, ele pode ser representado de várias maneiras:

  • Um inteiro decimal: 895;
  • Um número com um ponto (e não uma vírgula): 845.32;
  • Uma fração: ½, ¾;
  • Um número exponencial, ou seja, um número (eventualmente com vírgula) seguido da letra e (ou E) e de um inteiro correspondente à potência de 10 (assinado ou não, isto é, precedido de um + ou -): 2.75e-2; 35.8E+10; .25e-2.

Na verdade, os números reais são números com vírgula flutuante, ou seja, um número em que a posição da vírgula não é fixa e é identificada por uma parte de seus bits (conhecido como o expoente), o restante dos bits permitem codificar o número sem vírgula (a mantissa).

Os números do tipo float são codificados em 32 bits, incluindo:

  • 23 bits para o coeficiente;
  • 8 bits para o expoente;
  • 1 bit para o sinal.

Os números do tipo duplo são codificados em 64 bits, incluindo:

  • 52 bits para o coeficiente;
  • 11 bits para o expoente;
  • 1 bit para o sinal.

Os números do tipo longo duplo são codificados em 80 bits, incluindo:

  • 64 bits para o coeficiente;
  • 15 bits para o expoente;
  • 1 bit para o sinal.

A precisão dos números reais é aproximada. Ela depende do número de posições decimais, dependendo do tipo real, ela será, no mínimo, de:

  • 6 números para o tipo flutuante;
  • 15 números para o tipo duplo;
  • 17 números para o tipo longo duplo.

Caractere (char)

O tipo char (do inglês character) armazena o valor ASCII de um caractere, ou seja, um número inteiro.

Por padrão, os números são assinados, o que significa que eles têm um sinal. Para armazenar informações sobre o sinal (em binário), os computadores usam o complemento a dois. Então, um dado de tipo char é assinado, o que não significa que a letra possui um sinal, mas simplesmente que, na memória, o valor que codifica o caractere pode ser negativo.

Se, por exemplo, quisermos armazenar a letra B (seu código ASCII é 66), poderemos definir este dado, seja pelo número 66, seja notando o ’B’, onde as aspas simples significam código ASCII de...

Não existe tipo de dado para as cadeias de caracteres (strings) em linguagem C. Para criar uma string, vamos utilizar tabelas contendo um caractere em cada uma de suas caixas.

Como criar um tipo de dado

Em linguagem C, é possível definir um novo tipo de dados usando a palavra-chave typedef. Este admite a seguinte sintaxe:

typedef<ital>Características_do_tipo Nome_do_tipo</ital>

Onde

  • Características_do_tipo representa um tipo de dado existente (float, short int etc.);
  • Nome_do_tipo define o nome que você dá ao novo tipo de dado.

Assim, a seguinte instrução cria um tipo de dado Ch inspirado no tipo char:

typedef <bold>char Ch</bold>

Conversão do tipo de dado

A conversão do tipo de dado refere-se à alteração do tipo de dado para outro. Por exemplo, pode acontecer que você queira trabalhar com um tipo de variável e, em seguida, usar outro tipo. Imagine que você trabalhe com uma variável com vírgula flutuante (tipo float) e quer excluir os dígitos após a vírgula, ou seja, converter um float em int. Isso pode ser feito de duas maneiras:

Conversão implícita: consiste em uma modificação do tipo de dado executado automaticamente pelo compilador. Isso significa que, quando armazenamos um tipo de dado em uma variável declarada com outro tipo, o compilador não retornará um erro, mas efetuará uma conversão implícita do dado antes de atribuí-lo à variável:

int x; 
x = 8.324;

Onde x conterá o valor 8 depois da alocação.

Conversão explícita: também chamada de operação cast, consiste em uma modificação forçada do tipo de dado. Isso significa que você usa um operador, dito cast, para especificar a conversão. O operador de cast é simplesmente o tipo de dado no qual desejamos converter uma variável, entre parênteses, que precede a variável:

int x; 
x = (int)8.324; 
 

Onde x conterá o valor 8 depois da alocação.

Foto: © Unsplash

Nosso conteúdo é produzido em colaboração com especialistas em tecnologia da informação sob o comando de Jean-François Pillou, fundador do CCM.net. CCM é um site sobre tecnologia líder em nível internacional e está disponível em 11 idiomas.
Veja também
Este documento, intitulado 'Linguagem C: os tipos de dados', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.

Assine nossa newsletter!

Assine nossa newsletter!
Junte-se à comunidade