Representação de inteiros não negativos
- uso de 1, 2, 4 ou ... bytes para representar o número
na base 2
- representações big-endian (na memória, byte
mais significativo tem endereço mais baixo) e
little-endian (na memória, byte
mais significativo tem endereço mais alto)
- do ponto de vista do programa C, para
enxergar se a máquina é big-endian ou little-endian
é necessário "quebrar" o sistema de tipos. Por exemplo:
#include <stdio.h>
typedef unsigned char *byte_ptr;
void mostra (byte_ptr inicio, int tam) {
int i;
for (i=0;i<tam;i++)
printf("%.2x", inicio[i]);
printf("\n");
}
void mostra_int (int num) {
mostra((byte_ptr) &num, sizeof(int));
}
- limitações de representação:
- com 1 byte podemos
representar inteiros não negativos de 0 a 255
- com 2 bytes podemos
representar inteiros não negativos de 0 a 65.535
- com 4 bytes ...
- lembrar que essas limitações também valem para
endereços, ou seja:
- com 2 bytes só podemos expressar endereços de
0 a 65.535, ou seja, só podemos endereçar 64Kbytes de memória
- com 4 bytes podemos endereçar 4 Giga bytes de memória...
- definições do ANSI C:
- char: 1 byte
- short int: pelo menos 2 bytes (16 bits)
- int: pelo menos 2 bytes (16 bits)
- long int: pelo menos 4 bytes (32 bits)
- ... e representação de long int tem que ocupar pelo menos
tantos bytes quanto a de int que tem que ocupar pelo menos
tantos bytes como a de short int...
Caracteres
Operadores Bit a Bit em C
Álgebra booleana:
Deslocamento de bits (bit shifting): << , >>
int a, b, c;
a = 0xF;
b = ;
c = a << 4; /* c = 0xF0 */
...
Referência
- CS:APP, 2.2.1, 2.1.8, 2.1.9, 2.1.10.