Introdução
Este artigo foca os tipos de dados int e variantes disponíveis na linguagem de programação C. Na parte inicial, o artigo apresenta os tipos de dados inteiros ditos tradicionais. Seguidamente, o artigo introduz os tipos inteiros orientados para a portabilidade, tais como o int8_t
, uint_fast64_t
e similares. Os principais conceitos são ilustrados com exemplos, executados, sempre que conveniente, em duas plataformas Linux: uma plataforma de 32 bits Lubuntu 16.04 com a versão 5.3.1 do compilador gcc 5.3.1, e uma plataforma de 64 bits Lubuntu 17.04 com o gcc 6.3.0. A primeira é designada por L32, a segunda por L64. Note-se que ambos as versões do compilador usam nativamente a norma C11 (2011) da linguagem C.
Tipos de dados int
Como em muitas outras linguagens de programação, a linguagem C define um conjunto de tipos de dados inteiros. São exemplos os tipos de dados signed char
, signed short
, signed int
e signed long
e as variantes sem sinal, unsigned char
, unsigned short
, unsigned int
e unsigned long
. Na revisão à linguagem designada por norma C99 foi acrescentado o tipo inteiro long long
, nas variantes com (signed
) e sem (unsigned
) sinal.
O modificador signed
é assumido por omissão para os tipos int
, com exceção do tipo char
como é explicado mais adiante. Assim, a declaração int A
designa a variável A
como sendo um inteiro com sinal, sendo equivalente a signed int A
. Caso se pretenda uma variável int
sem sinal, torna-se necessário o uso do modificador unsigned
, como por exemplo, na declaração unsigned int B
.
Uma variável, qualquer que seja o seu tipo, ocupa sempre um determinado espaço na memória, espaço medido em octetos. A designação octeto deriva do facto de representar oito bits, sendo frequentemente empregue a designação byte
em sua substituição. Na linguagem C, o operador sizeof
devolve o tamanho em octetos, ocupado por um determinado tipo de dado. O tipo de dado pode ser indicado diretamente no sizeof
através do nome do tipo de dados (e.g., sizeof(short)
) ou indiretamente através de uma variável (e.g., int A; sizeof(A)
). No caso de se fazer uso de uma variável, os parêntesis podem ser omitidos no sizeof
(e.g, sizeof A
é equivalente a sizeof(A)
). O operador sizeof
devolve um valor do tipo size_t
. Na prática, o tipo size_t
corresponde a um inteiro sem sinal. O uso do size_t
em lugar de um inteiro sem sinal tem a vantagem de indicar a quem interage com o código fonte que o valor corresponde a um tamanho.
[...]