Representação de Dados Universidade Federal do Pará Faculdade de Computação Bacharelado em Ciência da Computação Fundamentos de Comunicação Digital 1
Representação de Dados Em um computador são armazenados e processados apenas dados e instruções. Um programa de computador é formado por uma seqüência de instruções que operam sobre um conjunto de dados (os dados são os operandos das instruções. Um computador executa operações sobre dados numéricos (os números) ou alfabéticos (letras e símbolos). 2
Representação de Dados Assim, os dados precisam ser representados no computador (na memória e no processador) sempre através de bits, de uma forma que o computador possa interpretar corretamente o seu significado e executar as operações adequadas. 3
Representação de Dados Tipos de dados numéricos ponto fixo (números inteiros) ponto flutuante (números reais ou fracionários) BCD (representação decimal codificada em binário) alfabéticos letras, números e símbolos (codificados em ASCII e EBCDIC) 4
Representação de Dados Números inteiros bit 0 ==> sinal positivo bit 1 ==> sinal negativo. Essa representação tem o nome de representação em sinal e magnitude. Valor decimal Valor binário com 8 bits (7 + bit de sinal) +9 00001001 (bit inicial 0 significa positivo) -9 10001001 (bit inicial 1 significa negativo) +127 01111111 -127 11111111 5
Representação de dados Números negativos Operações de subtração são efetuadas com operações de soma Complemento a 1 Inverte todos os bits do número 100101010 => 011010101 Complemento a 2 Mantém todos os 0´s e o primeiro 1, depois inverte todos os bits do número 100101010 => 011010110 6
Representação de dados Complemento a 1 1001110101 27-32 ? 32-27 ? Complemento a 2 001101110 26-13 ? 7-14 ? 7
Representação de números reais É impossível a representação de números reais em computadores binários digitais porque a representação binária é discreta. Em qualquer linguagem de programação utilizamos representações que preveem algum grau de arredondamento. 8
Representação de números reais Ponto Fixo Denotamos um número de ponto fixo quando especificamos o número de casas para a parte inteira e fracionária (Notação Q.n). 4 bits para parte inteira e 6 bits para parte fracionária: Notação Q.6 Qual precisão deste número? Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 1 23 22 21 20 2-1 2-2 2-3 2-4 2-5 2-6 9
Representação de números reais Soma em ponto Fixo A = 5,375 = 101,011 (Notação Q.3) B = 1,875 = 1,1110 (Notação Q.4) Calcular A + B 101,0110 (A com notação Q.4) + 001,1110 (B com notação Q.4) 111,0100 10
Representação de números reais Subtração em ponto Fixo A = 3,125 = 011,00100b (Notação Q.5) B = 0,5 = 0,10b (Notação Q.2) Calcular A – B Complemento a 2 de B = 111,10000 011,00100 (A com Q.5) + 111,10000 (B com Q.5 e complemento a 2) 1 010,10100 11
Representação de números reais IEEE 754-2008 Padrão para aritmética de ponto flutuantePonto flutuante Formato IEEE 754 precisão simples V = S . 2(expoent-127) . M V = (-1)sign . 2(expoent-127) . (1 + fraction) Formato IEEE precisão dupla V = (-1)sign . 2(expoent-1023) . (1 + fraction) 12
Representação de números reais Exemplo 1 10000001 011000000000000000000002 V = ? Verificação http://babbage.cs.qc.edu/IEEE-754/Decimal.html 13
Outros exemplos Type Sign Exp Exp+Bias Exponent Significand (Mantissa) Value Zero -127 0000 0000 000 0000 0000 0000 0000 0000 0.0 Zero Negativo 1 −0.0 Um 127 0111 1111 1.0 Menos Um −1.0 Menor denormalized number * 000 0000 0000 0000 0000 0001 ±2−23 × 2−126 = ±2−149 ≈ ±1.4 × 10−45 Médio denormalized number 100 0000 0000 0000 0000 0000 ±2−1 × 2−126 = ±2−127 ≈ ±5.88 × 10−39 Maior denormalized number 111 1111 1111 1111 1111 1111 ±(1−2−23) × 2−126 ≈ ±1.18 × 10−38 Menor normalized number -126 0000 0001 ±2−126 ≈ ±1.18 × 10−38 Maior normalized number 254 1111 1110 ±(2−2−23) × 2127 ≈ ±3.4 × 1038 Ininito positivo 128 255 1111 1111 +∞ Infinito negativo −∞ Not a number non zero NaN * Sign bit can be either 0 or 1 . 14
Ponto Fixo x Ponto Flutuante Ponto fixo possui um baixo custo de implementação em circuitos lógicos. Ponto flutuante possui: Maior precisão Circuitos mais complexos e maior dimensão Maior custo Menor tempo de desenvolvimento 15
Representação de dados Linguagem C short: inteiros curtos int: inteiros long: inteiros longos float: ponto flutuante precisão simples double: ponto flutuante precisão dupla Cada tipo é representado por um conjunto de bytes 16
Representação de dados Função sizeof É usado para verificar a quantidade de bytes que um tipo de dados ocupa no sistema operacional Exemplos printf(“%d”, sizeof( int ) ); 17
Representação de dados printf( "Número de bytes de short: %d\n", sizeof( short ) ); printf( "Número de bytes de int: %d\n", sizeof( int ) ); printf( "Número de bytes de long: %d\n", sizeof( long ) ); printf( "Número de bytes de float: %d\n", sizeof( float ) ); printf( "Número de bytes de double: %d\n", sizeof( double ) ); Numero de bytes de short: 2 Numero de bytes de int: 4 Numero de bytes de long: 4 Numero de bytes de float: 4 Numero de bytes de double: 8 18
Representação de dados Bytes de um tipo de dado union Representa uma mesma localização de dados ocupada por duas variáveis com nomes distintos union tipo1 { char ch[2]; short temp; }; 19
Representação de dados union tipo1 SHORT; cout << "\n\nDigite um caracter: "; cin >> SHORT.ch[0]; cout << "Digite outro caracter: "; cin >> SHORT.ch[1]; cout << "O numero " << SHORT.temp << " eh representado pelos caracteres " << SHORT.ch[1] << " e " << SHORT.ch[0] << "\n"; Digite um caracter: a Digite outro caracter: b O numero 25185 eh representado pelos caracteres b e a 20
Representação de dados union tipo2 { char ch[8]; double x; }; union tipo2 real; cout << "\n\nDigite um numero real: "; cin >> real.x; cout << "Caracteres que representam " << real.x << ": "; for( int i=0; i<sizeof(double); i++ ) cout << real.ch[i] << " "; } cout << "\n\n"; 21
Ordenação de bytes Palavra de 4 bytes Big Endian Litlle Endian Computadores Sun, Mac Byte menos significativo com maior endereço Litlle Endian Computadores Alpha e PC´s Byte menos significativo no menor endereço 22
Ordenação de bytes Exemplo x = 0x01234567 x inicia no endereço 0x100
Ordenação de bytes Transparente para o programador C. Importante para a transmissão de dados entre máquinas big endian e litlle endian. 24
Big ou Litlle Endian? #include "stdafx.h" #include <stdio.h> #include <stdlib.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)); } int _tmain(int argc, _TCHAR* argv[]) int x=1; mostra_int( x ); system("pause"); return 0; 25
Operações bit-a-bit AND & OR | NOT ~ XOR ^ Deslocamento para esquerda << Deslocamento para direita >> 26
Operações bit-a-bit Exemplos x = x & 3; y = y | 255; z = ~127; w = 32 ^ 64; a = 24 << 2; b = 24 >> 1; 27