Sistemas de Computação
Bits
Bits ee operações
operações
Porque utilizar base 2 ?
Sistemas de Computação
• Representação na base 10
– Estamos acostumados
– Representação natural para transações financeiras (precisão)
• Implementação eletrônica na base 10
– Difícil de armazenar
– Difícil de codificar 10 níveis de tensão em um único fio
– Difícil de implementar operações básicas (soma, multiplicação
etc.)
Representação Binária
Sistemas de Computação
• Circuitos eletrônicos trabalham com tensões com
valores analógicos, podendo assumir qualquer
valor nos limites permitidos
– Ex: Alimentação de 0 a 5 V, valores de 3,67 V, 0,5 V
• Circuitos digitais partem de circuitos eletrônicos e
identificam apenas dois valores: 0 e 1
• Uma faixa de valores é definida como 1 e outra
como 0
– Ex: Tecnologia TTL: 2-5V 1, 0-0,8 V 0
Representação Binária
Sistemas de Computação
• Vantagens:
– Fácil de armazenar em elementos biestáveis
– Precisão pode ser menor
• 2,8V e 3,3 V correspondem a 1
– Implementação mais fácil das operações aritméticas
• Números de bits necessários para expressar N
coisas diferentes é K, onde K é o menor número tal
que 2K N
– Ex: Qual a cor do seu cabelo (preto,castanho,louro e ruivo)?
4 opções, 2K 4, K=2, 2 bits, 00(preto), 01(castanho), 10(louro),
11(ruivo)
Organização da memória
Sistemas de Computação
• Computadores acessam grupos de bits de uma vez
• Menor unidade de endereçamento 1 byte = 8 bits
• Programa em linguagem de máquina enxerga a
memória como um grande array de bytes,
denominado memória virtual
• Cada byte de memória possui um endereço
associado a ele e o conjunto de endereços é
conhecido como espaço de endereçamento virtual
Organização da memória
Sistemas de Computação
• Este espaço é implementado por uma combinação
de elementos:
– SRAM, DRAM, disco e sistema operacional
• No Unix e Windows, espaço de endereçamento
privativo de um processo particular
• Tarefas do compilador e sistema de execução
– Alocar e gerenciar onde os programas executáveis devem ser
armazenados
– Vários mecanismos: estático, stack e heap
– A alocação é sempre realizada dentro de um único espaço de
endereçamento virtual
Representação Hexadecimal
Sistemas de Computação
• Representação binária requer muitos 1s e 0s
– 8 bits: 000000002 a 111111112
• Representação hexadecimal é um sistema baseado
na base 16
• Requer 16 dígitos diferentes:
– 0 a 9, A a F
• Cada dígito hexadecimal representa 4 bits de
número representado em binário
– 8 bits: 0016 a FF16
Conversão entre Bases 2 e 10
Sistemas de Computação
• Números são representados utilizando-se a base 2
– 1012, número binário cujo valor decimal é 5
• Valor de um número decimal:
– D0 100 + D1 101 + D2 102 + …
– 903, D0 = 3, D1 = 0, D2 = 9
– 3 100 + 0 101 + 9 102 =903
• Valor decimal de um número binário:
– B0 20 + B1 21 + B2 22 + …
– 100011011, B0,, B1 ,B3, B4, B8
– 20 + 21 + 23 + 24 + 28 = 1 + 2 + 8 + 16 + 256 = 283
Conversão entre Bases
Sistemas de Computação
• Um computador possui uma unidade básica de
informação de 12 bits. Quantos números podem
ser representados por essa unidade básica e quais
são eles ?
Conversão entre Base 10 e 2
Sistemas de Computação
1. Dividir número decimal por 2 e colocar o resto
como o algarismo menos significativo
2. Enquanto o quociente for diferente de 0
2.1 Dividir o quociente por 2
2.2 Colocar o resto à esquerda do anterior
2.3 Volte ao passo 2
Representação de Números em Base 16,
10 e 2
Sistemas de Computação
Dígito hexadecimal
Valor decimal
Valor binário
0
0
0000
1
1
0001
2
2
0010
3
3
0011
4
4
0100
5
5
0101
6
6
0110
7
7
0111
8
8
1000
9
9
1001
A
10
1010
B
11
1011
C
12
1100
D
13
1101
E
14
1110
F
15
1111
Conversão entre as Base 2 e 16
Sistemas de Computação
• 16 = 24
• Um algarismo hexadecimal é representado por 4
bits
• Divide-se o número binário em grupos de 4 bits da
direita para a esquerda e substitui-se o algarismo
hexadecimal correspondente ao grupo
Ex:
(1011011011)2
(0010)(1101)(1011)2=(2DB)16
2
D
B
Conversão entre as Base 16 e 2
Sistemas de Computação
• Substitui-se cada algarismo hexadecimal pelo
grupo de 4 bits correspondente
Ex:
(306)16
(0011)(0000)(0110)2=(001100000110)2
3
0
6
Conversão entre Bases 16 e 10
Sistemas de Computação
• Valor decimal de um número hexadecimal:
– H0 160 + H1 161 + H2 162 + …
Ex:
(2A5)16 = 5160 + 10161 + 2162 = 5 +160 + 512 = (677)10
Conversão entre Base 10 e 16
Sistemas de Computação
1. Dividir número decimal por 16 e colocar o resto
como o algarismo menos significativo
1. Enquanto o quociente for diferente de 0
2.1 Dividir o quociente por 16
2.2 Colocar o resto à esquerda do anterior
2.3 Volte ao passo 2
Palavras utilizadas nas máquinas
Sistemas de Computação
• Cada máquina possui um tamanho de palavra
– Define o maior tamanho de inteiro da máquina incluindo endereços
• A maioria das máquinas possui uma palavra de
tamanho igual a 32 bits
– Limita endereçamento a 4GB
• Estão aparecendo sistemas com tamanho de
palavra de 64 bits
– Capacidade de endereçamento de aproximadamente 1,8 1019
bytes
Organização da memória orientada a
palavra
Sistemas de Computação
•
Endereços especificam
localizações de bytes
–
endereço do primeiro byte da
palavra
–
endereços de palavras
sucessivas diferem por 4 (32bit) ou 8 (64-bits)
Palavra de
32 bits
Palavra de
64 bits
End.
=
0000
End.
=
0004
End.
=
0008
End.
=
0012
End.
=
0000
End.
=
0008
Bytes
Endereços
0000
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
Representação de dados
Sistemas de Computação
• As máquinas suportam múltiplos formatos de
dados
– Utilizam frações ou números múltiplos do tamanho da palavra
– Sempre um número inteiro de bytes
• Tamanhos de objetos em C (em bytes)
Declaração em C
32-bit típico Compaq Alpha
char
1
1
short int
2
2
int
4
4
long int
4
8
char *
4
8
float
4
4
double
8
8
Ordenação dos bytes
Sistemas de Computação
• Como os bytes de uma palavra multibytes devem
ser ordenados na memória ?
• PCs são máquinas Little Endian
– O byte menos significativo possui o menor endereço
• Suns, Macs são máquinas Big Endian
– O byte menos significativo possui o maior endereço
Ordenação dos bytes
Sistemas de Computação
• Exemplo:
– Variável X possui a representação 0x01234567
– Endereço de X é 0x100
Big endian
0x100 0x101
01
23
0x102 0x103
45
67
0x100 0x101
67
45
0x102 0x103
23
01
Little endian
Examinando representação de dados
Sistemas de Computação
• Código para imprimir a representação de dados
• Associa a um ponteiro o tipo unsigned char *
cria um array de bytes
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len)
{
int i;
for (i=0; i<len; i++)
printf("%p\t%.2x\n", start+i,start[i]);
printf("\n");
}
Examinando representação de dados
Sistemas de Computação
•
int a = 15213;
•
printf("int a = 15213;\n");
•
show_bytes((byte_pointer) &a,
sizeof(int);
Resultado:
int a = 15213;
11ffffcb8
11ffffcb9
11ffffcba
11ffffcbb
6d
3b
00
00
Representando inteiros
Sistemas de Computação
int A = 15213;
Decimal: 15213
Binário: 0011 1011 0110
Hexa:
3
B
6
Alpha, Linux, NT
6D
3B
00
00
Sun
00
00
3B
6D
1101
D
Representando ponteiros
Sistemas de Computação
int A = 15213
A0
int *P = &A
FC
FF
Endereço Alpha
Hexa: 1
F
F
F
F
F
C
A
0
Bin.: 0001 1111 1111 1111 1111 1111 1100 1010 0000
Endereço Sun
Hexa: E
F
F
F
F
B
2
C
Bin.: 1110 1111 1111 1111 1111 1011 0010 1100
FF
01
00
00
00
EF
FF
FB
2C
Representando floats
Sistemas de Computação
float A = 15213,0;
Alpha, Linux, NT
00
B4
6D
46
Sun
46
6D
B4
00
Representação em ponto flutuante padrão IEEE
Hexa:
4
6
6
D
B
4
0
0
Binário: 0100 0110 0110 1101 1011 0100 0000 0000
Representando strings em C
Sistemas de Computação
•
•
Representados como um
array de caracteres
char *S= ”15123 ”
Cada caracter no formato
ASCII
codificação 7-bit
– caracter 0 tem o cód. 0x30
• dígito i tem cód. 0x30+i
–
•
•
•
Último caracter é o
caracter nulo
Sem problemas de
ordenação de bytes, pois o
dado é um byte
Arquivos texto geralmente
independentes de
plataforma
Alpha, Linux, NT
Sun
31
31
35
32
35
32
31
33
31
33
00
00
Representação de código de máquina
Sistemas de Computação
• O programa é codificado como uma seqüência de
instruções
– Operações simples: aritméticas, leitura ou escrita da memória,
desvio condicional
– Instruções codificadas em bytes
• Alpha, Sun,Mac utilizam instruções de 4 bytes (RISC)
• PC utiliza instruções de tamanho variável (CISC)
– Tipos de instruções e codificação diferentes para máquinas
diferentes
• código binário não compatível
Representando instruções
Sistemas de Computação
int sum (int x, int y)
{
return x+y;
}
•
Alpha e Sun utilizam 2
instruções de 4 bytes
•
PC utiliza 7 instruções de
1, 2 e 3 bytes
–
estruturas do programa em NT
e Linux diferentes
Alpha
00
00
30
42
01
80
FA
6B
Sun
PC
81
C3
E0
08
90
02
00
09
55
89
E5
8B
45
0C
03
45
08
89
EC
5D
C3
Álgebra booleana
Sistemas de Computação
• Desenvolvida por George Boole no século 19
aplicada por Claude Shannon em sistemas digitais
(1937)
• Representação algébrica da lógica codifica
VERDADEIRO como 1 e FALSO como 0
• Operações :
– AND: A & B=1 somente quando A=1 e B=1
– OR: A | B 1 quando A=1 ou B=1
– NOT: ~A=1 quando A=0
– XOR= A^B=1 quando A=1 ou B=1, mas não ocorre quando ambos
iguais a 1
Álgebra booleana
Sistemas de Computação
• Pode operar em vetores de bits
01101001
& 01010101
01101001
| 01010101
01101001
^ 01010101
~01010101
01000001
01111101
00111100
10101010
• Representação de conjuntos
– Um vetor com w bits representa os subconjuntos {0,...,w} e
aj=1 se j A
• 01101001 {0,3,5,6}
• 01010101 {0,2,4,6}
– & Interseção
01000001
– | União
01111101
– ~ Complemento 10101010
{0,6}
{0,2,3,4,5,6}
{1,3,5,7}
Operações com bits em C
Sistemas de Computação
• Operações &, |, ~,^disponíveis em C
– Se aplicam a qualquer tipo inteiro: long, int, short, char
• Tratam os argumentos como vetores de bits
• Exemplos (tipo char)
– ~0x41
0xBE
01000001
– 0x69
01101001
– 0x69
01101001
10111110
&
0x55
0x41
&
01010101
01000001
| 0x55
| 01010101
0x7D
01111101
Operações com bits em C
Sistemas de Computação
• Rotina para trocar os valores armazenados nos
endereços estipulados pelas variáveis do tipo
ponteiro x e y
void
{
*x
*y
*x
}
troca(int *x, int *y)
= *x ^ *y; /* 1 */
= *x ^ *y; /* 2 */
= *x ^ *y; /* 3 */
Passo
Início
1
2
3
Final
*x
A
A^B
A^B
*y
B
B
(A^B)^B=A^(B^B)=
A^0=A
(A^B)^A=(B^A)^A=
A
B^(A^A)=B^0=B
B
A
Operações lógicas em C
Sistemas de Computação
• Operações &&, ||, ! disponíveis em C
– Tratam 0 como FALSO
– Qualquer coisa diferente de 0 é VERDADEIRO
– Sempre retorna 1 ou 0
• Exemplos (tipo char)
– !0x41
0x00
– !0x00
0x01
– !!0x41
0x01
– 0x69 && 0x55
0x01
– 0x69 || 0x55
0x01
Operações de deslocamento em C
Sistemas de Computação
Deslocamento à esquerda: x << y
–
desloca o vetor de bits x, y posições para
a esquerda
–
joga fora os bits deslocados da esquerda
–
preenche os bits da direita com 0s
Deslocamento à direita: x >> y
–
desloca o vetor de bits x, y posições para
a direita
–
joga fora os bits deslocados da direita
–
preenche os bits da esquerda com 0s para
desl. lógico
–
preenche os bit da esquerda com o bit mais
à esquerda que sobrou para desl.
aritmético
Argumento x
<< 3
01100010
00010000
Log. >> 2
00011000
Aritm. >> 2
00011000
Argumento x
10100010
<< 3
00010000
Log. >> 2
00101000
Aritm. >> 2
11101000