Roteiro de Laboratório 02
Representação Numérica, Operações Aritméticas, Overflow e Underflow
Equipe
Matrícula Nome
1 Objetivos
● Observar, experimentalmente, como números são representados em um sistema computacional, algumas funções aritméticas e o que é overflow e underflow.
2 Observações
● Será utilizado um programa em C para o estudo destas representações.
● A linguagem C permite que se faça operações lógicas “bit-a-bit” em números, ou seja, as operações são realizadas em cada um dos bits que compõem o número. ● As operações lógicas “bit-a-bit” só podem ser realizadas em dados dos tipos char,
int e long int. Segue abaixo os operadores “bit-a-bit”:
Operador Ação
& and
| or
^ xor
~ not
>> shift right (deslocamento de bits à direita)
<< shift left (deslocamento de bits à esquerda)
▪ and: realiza uma operação lógica and utilizando cada um dos bits do primeiro
operando com os respectivos bits do segundo operando. Exemplo: 1010 & 1100 = 1000
operando com os respectivos bits do segundo operando. Exemplo: 1010 | 1100 = 1110
▪ xor: realiza uma operação lógica xor utilizando cada um dos bits do primeiro
operando com os respectivos bits do segundo operando. Exemplo: 1010 ^ 1100 = 0110
▪ not: inverte os bits de um número binário. Exemplo: ~10000 = 01111
▪ shift right (i >> n): insere n bits à direita da representação binária de i.
Exemplo: 16 >> 3 = 2 (10000 >> 3 = 00010)
▪ shift left (i << n): insere n bits à direita da representação binária de i. Exemplo:
2 << 3 = 16 (00010 << 3 = 10000)
● Cada tipo de dado possui um valor mínimo e um valor máximo que pode ser atribuído a este. Segue abaixo uma tabela com os valores mínimo e máximo para cada um dos tipos de dados disponíveis na linguagem C.
Tipo de Dado Bytes Valor Mínimo Valor Máximo
char 1 -127 127 unsigned char 1 0 255 signed char 1 -127 127 int 4 -2.147.483.648 2.147.483.647 unsigned int 4 0 4.294.967.295 signed int 4 -2.147.483.648 2.147.483.647 short int 2 -32.768 32.767
unsigned short int 2 0 65.535
signed short int 2 -32.768 32.767
long int 4 -2.147.483.648 2.147.483.647
unsigned long int 4 0 4.294.967.295
signed long int 4 -2.147.483.648 2.147.483.647
float 4 seis dígitos de precisão
double 8 dez dígitos de precisão
long double 10 dez dígitos de precisão
3 Procedimento
● Acrescente dois arquivos ao projeto: funcoesDeBase.c e funcoesDeBase.h. ● No arquivo funcoesDeBase.h acrescente o código abaixo:
#ifndef FUNCOESDEBASE_H_INCLUDED #define FUNCOESDEBASE_H_INCLUDED void printbits8(unsigned int x);
void printbitsFloat(float x);
#endif // FUNCOESDEBASE_H_INCLUDED
● No arquivo funcoesDeBase.c acrescente o código abaixo: #include <stdio.h>
#include "funcoesDeBase.h" void printbits8(unsigned int x) { printf("%d = ", x); int i; for(i = 7; i >= 0; i--) printf("%c", '0' + ((x >> i) & 1)); printf("\n"); } void printbitsFloat(float x) { int i; for(i = 31; i >= 0; i--)
printf("%c", '0' + (((long int)x >> i) & 1)); printf("\n");
}
● No arquivo main.c acrescente o código abaixo: #include <stdio.h> #include <stdlib.h> #include "funcoesDeBase.h" int main() { unsigned int a, b; a = 42; b = 21; printf("a = %d\n", a); printf("b = %d\n\n", b);
//Verificação das operações bit-a-bit
printf("Exemplos das operacoes bit-a-bit:\n"); printf(" a & b = %d\n", a & b);
printf(" a | b = %d\n", a | b); printf(" a ^ b = %d\n", a ^ b); printf(" ~a = %d\n", ~a); printf("a >> 2 = %d\n", a >> 2); printf("a << 2 = %d\n\n", a << 2); //Verificação de números em Base Binária
printf("Exemplos de numeros em Base Binaria:\n"); printbits8(42);
printbits8(99);
//Verificação de números em Base Hexadecimal
printf("\nExemplos de numeros em Base Hexadecimal:\n"); printf(" 92 = %x\n", 92);
printf("256 = %x\n\n", 256);
//Verificação de números em Base Octal
printf("Exemplos de numeros em Base Octal:\n"); printf("39 = %o\n", 39);
printf("45 = %o\n\n", 45); float x = 2.15625;
//Verificação de números sinalizados em Base Binária
printf("Exemplos de numeros sinalizados em Base Binaria:\n"); printbits8(21);
printbits8(-21); printbits8(145); printbits8(-145);
//Verificação de números sinalizados em Base Hexadecimal
printf("\nExemplos de numeros sinalizados em Base Hexadecimal:\n"); printf(" 421 = %x\n", 421);
printf("-421 = %x\n", -421); printf(" 256 = %x\n", 256); printf("-256 = %x\n\n", -256);
//Verificação de números em Base Octal
printf("Exemplos de numeros em Base Octal:\n"); printf(" 123 = %o\n", 123);
printf("-123 = %o\n", 123); printf(" 726 = %o\n", 726); printf("-726 = %o\n\n", 726);
//Verificação de números Reais sinalizados printf("Exemplos de numeros Reais:\n"); printf("%f = %x\n", x, (unsigned long int)x); printf("3.141592 = %x\n\n", 3.141592); int i, t, y, f, g, c, add, sub, mult, mod; float div, w, z, d, e;
y = 6;
printf("Exemplos dos Operadores Aritmeticos Basicos:\n"); add = 19 + 6;
printf("19 + 6 = %i\n", add); sub = 19 - 6;
printf("19 - 6 = %i\n", sub); mult = 19 * 6;
printf("19 * 6 = %i\n", mult); mod = 19 % 6;
printf("19 %% 6 = %i\n", mod); div = 19 / 6;
printf("19 / 6 = %f\n", div);
printf("\nExemplos dos Operadores Aritmeticos Especiais:\n"); t = 4;
printf("t valia 4. Agora, t = %d (t++)\n", t++); t = 4;
printf("t valia 4. Agora, t = %d (++t)\n", ++t); t = 4;
printf("t valia 4. Agora, t = %d (t--)\n", t--); t = 4;
printf("t valia 4. Agora, t = %d (--t)\n", --t); t = -3;
y = 2; w = 5.7; z = 8.2;
printf("\nExemplos dos Operadores Aritmeticos da biblioteca math.h:\n"); f = fabs(x); printf("f = %i\n", f); g = pow(f, y); printf("g = %i\n", g); d = floor(w); printf("d = %f\n", d); c = sqrt(w * 125); printf("c = %i\n", c); e = ceil(z); printf("e = %f\n", e);
printf("\nExemplo para mostrar overflow:\n"); for(i = 0; i <= 32; i++)
printf("2 elevado a %i = %i\n", i, (int)pow(2, i)); printf("\nExemplo para mostrar underflow:\n"); for(i = 0; i <= 32; i++)
printf("-(2 elevado a %i) = %i\n", i, (int)(-1 * pow(2, i))); printf("\n");
x = 45;
//Verifique o que ocorre quando a linha abaixo é descomentada. //x /= 0;
system("pause"); return 0;
}
● Após acrescentar todos os códigos a seus respectivos arquivos, compile o programa e execute um debug no programa. Analise o programa e descreva o que ocorre em cada um dos exemplos.
___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ 4 Exercícios
● Utilizando como base o programa fornecido, crie uma função semelhante à
printbits8, de modo a imprimir um número do tipo long int.
● Crie uma função para demonstrar o tamanho dos tipos de dados, em bytes e em bits, citados neste roteiro.
● Dê a diferença entre pré-decremento/incremento e pós-decremento/incremento. ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ● Dê as definições de: a. overflow ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ b. underflow ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________