Tipos Fundamentais Básicos
Anteriormente vimos que funções, parâmetros e variáveis podem representar diferentes tipos de dados. Alguns tipos já estão embutidos como palavras-chave na linguagem, e serão chamados de tipos fundamentais. Esse grupo inclui os tipos inteiros e os tipos flutuantes, que podem ser vistos abaixo.
Tipos Inteiros
Tipo int
Representa um número inteiro, como -30 ou 529. O menor e maior número
representável em um int não está definido no padrão C, mas um int
representará, no mínimo, qualquer número inteiro no intervalo
[-32767,32767].
Tipo char
Representa um caractere, como ' ' (espaço em branco), s (letra S minúscula)
ou ? (ponto de interrogação). Os caracteres em C devem estar dentro de aspas
simples; "a" não é um caractere, mas 'a' é.
char bar = 'a'; // Okay
char foo = "a"; // Erro
Alguns caracteres não podem ser simplesmente digitados, portanto são
representados utilizando sequências de escape, nesse caso uma barra
invertida \ seguida de um caractere. Na tabela abaixo estão algumas sequências
de escape.
| Sequência | Descrição | 
|---|---|
| \a | Produz um alerta audível ou visual | 
| \n | Produz uma quebra de linha | 
| \\' | Produz uma aspa simples | 
Tentar armazenar uma aspa simples em um char pode ser complicado, pois em
char ch = '''; o compilador procura um caractere contido entre o primeiro par
de aspas, porém não há nada dentro. Nesse caso devemos utilizar a sequência de
escape \': char ch = '\'';.
char ch = '''; // Erro
char ch = '\''; // Okay
Valores char são internamente representados por valores inteiros, e o valor de
cada caractere depende do sistema. Muitos sistemas utilizam o conjunto de
caracteres ASCII, parcialmente mostrado na tabela abaixo.
| Valor | Caractere | Valor | Caractere | Valor | Caractere | 
|---|---|---|---|---|---|
| 32 | (espaço) | 65 | A | 97 | a | 
| 48 | 0 | 66 | B | 98 | b | 
| 49 | 1 | 67 | C | 99 | c | 
| 50 | 2 | 68 | D | 100 | d | 
| 51 | 3 | 69 | E | 101 | e | 
| 52 | 4 | 70 | F | 102 | f | 
| 53 | 5 | 71 | G | 103 | g | 
| 54 | 6 | 72 | H | 104 | h | 
| 55 | 7 | 73 | I | 105 | i | 
| 56 | 8 | 74 | J | 106 | j | 
| 57 | 9 | 75 | K | 107 | k | 
Quando um char é convertido para um int, o resultado é o valor inteiro que
representa o caractere no conjunto de caracteres utilizado. Quando um int é
convertido para char, o resultado é o caractere que representa o valor inteiro
no conjunto de caracteres utilizado.
char ch = 65; // ch é igual a 'A' se o conjunto de caracteres for ASCII
int i = 'A'; // i é igual a 65 se o conjunto de caracteres for ASCII
Tipo _Bool
É equivalente ao bool de outras linguagens de programação, mas possui outro
nome pois esse tipo foi adicionado no padrão C99 e usar o nome bool quebraria
vários programas antigos.
Serve para armazenar um de dois valores: verdadeiro ou falso. Aqui está um
exemplo de duas variáveis _Bool, com valores que indicam, respectivamente,
verdade e falsidade:
_Bool verdadeiro = 1;
_Bool falso = 0;
Utilizar a palavra-chave _Bool pode não ser intuitivo. Por conveniência, é
recomendado incluir o arquivo <stdbool.h>, que faz com que bool se referia a
_Bool e permite utilizar as palavras true (verdadeiro) e false (falso).
Veja o mesmo código que acima porém utilizando <stdbool.h>:
bool verdadeiro = true;
bool falso = false;
Sempre que bool, true ou false forem utilizados, considere que estamos
usando a diretiva #include <stdbool.h> mesmo que em alguns exemplos ela possa
estar omitida por conveniência. É útil lembrar, também, que true se refere ao
valor 1 e false ao valor 0.
Um exemplo de uso do bool são predicados—termo comum para funções que retornam
verdadeiro ou falso. Suponhamos que a função Paridade seja um predicado que
verifica a paridade de um número, retornando true caso ele seja par e false
caso contrário.
Paridade(1); // false
Paridade(3); // false
Paridade(5); // false
Paridade(2); // true
Paridade(4); // true
Paridade(6); // true
Exemplos de predicados existentes na biblioteca padrão são algumas funções do
<ctype.h>, como isalpha que retorna true caso a função receba um caractere
alfabético, como uma letra (o comportamento pode variar conforme a localidade).
isalpha('a'); // true
isalpha('x'); // true
isalpha('L'); // true
isalpha('1'); // false
isalpha(','); // false
isalpha('?'); // false
Tipos Flutuantes
Tipo double
Representa um número real, como -30.52 ou 529.0023. Ao ser convertido para
um inteiro a parte fracionária é descartada, portanto 15.89 se torna 15. Se
o valor for alto/baixo demais para ser representado por um int, o
comportamento é indefinido.
int i = 15.89; // i é igual a 15
Referências
- Padrão C18 (ISO/IEC 9899:2018):
- 5.2 Environmental considerations:
- 5.2.2 Character display semantics
 - 5.2.4.2.1 Sizes of integer types <limits.h>
 
- 6.4.4.4 Character constants
 
- 5.2 Environmental considerations: