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 :numref:`tipos_dimensoes`. .. table:: Dimensões dos tipos básicos da linguagem C na arquitetura P16 :name: tipos_dimensoes +-----------------------------------------------+------------------------------+ | 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``. 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 :numref:`memory_types` 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**. .. figure:: figures/memory_types.svg :name: memory_types :align: center Valores de tipos básicos em memória 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 :numref:`types_in_registers_a` 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. .. figure:: figures/types_in_registers_a.png :name: types_in_registers_a :align: center :scale: 10% Valores de tipos básicos em registos