2. Tipos de dados

Para a representação de valores inteiros, a linguagem C dispões das designações base char e int, dos modificadores de sinal signed e unsigned e dos modificadores de dimensão short e long.

Como a linguagem C não define dimensões concretas para os tipos numéricos, foi definido, ao nível da biblioteca normalizada, a existência dos tipos intXX_t sendo XX o número de bits dessa representação concreta. A variante uintXX_t representa valores no conjunto dos números naturais e a variante intXX_t representa valores no conjunto dos números relativos.~

Na programação em assembly do P16, tendo como referência a linguagem C, considera-se que os tipos básicos são representados com as dimensões em bits indicadas na Tabela 2.1.

Tabela 2.1 Dimensões dos tipos básicos da linguagem C na arquitetura P16

Designação do tipo na linguagem C

Representação binária no P16

Relativos

Naturais

bits

signed char

unsigned char

8

signed short int

unsigned short int

16

signed int

unsigned int

16

signed long int

unsigned long int

32

int8_t

uint8_t

8

int16_t

uint16_t

16

int32_t

uint32_t

32

A designação char é equivalente a unsigned char. A designação int é equivalente a signed int. A designação short é equivalente a short int. A designação long é equivalente a long int.

2.1. Dados em memória

A memória de um computador é modelada como uma sequência de lugares onde se armazenam palavras de oito bits (um byte). Cada lugar, designado por “posição de memória”, tem capacidade para armazenar um byte e é identificado por um valor numérico designado por “endereço de memória”,

Os valores representados com palavras de 8 bits podem ser alojados em qualquer posição de memória.

Os valores representados com palavras de 16 bits, ocupam duas posições de memória contíguas. A posição de memória de endereço menor deve ser par – designa-se por “alinhamento par”. Na referenciação por endereço de uma palavra de múltiplos bytes, utiliza-se o endereço menor.

Por exemplo, na Figura 2.1 a palavra de 16 bits que suporta a representação da variável h, ocupa duas posições de memória, possui alinhamento par e o seu endereço é 0x1006.

_images/memory_types.svg

Figura 2.1 Valores de tipos básicos em memória

2.2. Dados em registo

As instruções do P16 operam sobre palavras de 16 bits. Ao carregar um valor a 8 bits (tipos char, int8_t ou uint8_t) num registo do processador, é necessário extender a representação desse valor para 16 bits. Para o tipo char e uint8_t a extensão consiste em afetar os bits das posições 8 a 15 com o valor zero. Para o tipo int8_t a extensão consiste em afetar os bits das posições 8 a 15 com o valor do bit da posição 7 (bit de sinal).

Na Figura 2.2 exemplifica-se o carregamento de valores de diversos tipos em registos do processador. Os conteúdos dos registos estão escritos em hexadecimal. As zonas sombreadas correspondem a conteúdos acrescentados para extensão da representação. Por exemplo, o registo R1 recebe nas posições 0 a 7 o valor 0xD3, e nas posições 8 a 15 o valor 0xff para manter a representação do valor -45.

_images/types_in_registers_a.png

Figura 2.2 Valores de tipos básicos em registos