Tipos de dados int e variantes na linguagem C

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.

[...]

Leia o artigo completo na edição 58 da Revista PROGRAMAR

Publicado na edição 58 (PDF) da Revista PROGRAMAR.