Gabarito da Lista1
Transcrição
Gabarito da Lista1
Computadores e Programação (MAB-353) Primeira Lista de Exercı́cios Individual Prof. Paulo Aguiar (DCC/IM/UFRJ)- GABARITO Entrega: 11/03/2014 Questão 1 (20 pontos) Em aula, ao rodar um programa comilado em 32 bits que calcula int x = 200x300x400x90 e imprime x, obteve-se -2.134.967.296. a) (5) Se o endereço de x é 0x10100000, indique o conteúdo da memória em hexa referente aos endereços 0x10100000 a 0x10100003, em arquitetura little endian e big endian. R:200X300X400X90 = 2.160.000.000 = 2.147.483.648 + 12.516.352 = 0x80000000 + 0x00BEFC00 = 0x80BEFC00. Se estivermos em um arquitetura little endian como intel, e representando [end] como o conteúdo do endereço end, teremos: [0x10100000] = 00, [0x10100001] = FC, [0x10100002] = BE, [0x10100003] = 80. Para uma arquitetura big endian, terı́amos: [0x10100000] = 80, [0x10100001] = BE, [0x10100002] = FC, [0x10100000] = 00. b) (10) Justifique com argumentos claros a razão de obtenção do resultado o conteúdo Qual o conteúdo da memória correspondente Indique o conteúdo de memória correspondente ao resultado -2.134.967.296 e o conteúdo do item anterior. Dê todas as justificativas pertinentes. R: 200X300X400X90 = 2.160.000.000 = 2.147.483.648 + 12.516.352 → 2.147.483.647 overflow. Mas 2.147.483.648 + 12.516.352 = 0x80000000 + 0x00BEFC00 e interpretando o conteúdo de memória 0x80BEFC00 em C2 tem-se = -2147.483.648 + 12.516.352 = -2.134.967.296. c) (5) Se for impresso o conteúdo da memória como um inteiro sem sinal (unsigned int), que valor será impresso? R: 2.160.000.000. Questão 2 (20 pontos) Resolva o problema 2.61 do livro texto. Veja restrições para a solução na página 120. Pode usar sizeof(int) para retornar o tamanho do inteiro na arquitetura em questão. Cada item da questão vale 5 pontos. Resp.: A. (5) !!x B. (5) !! ∼ x C. (5) !!(x & 0xFF) D. (5) !!( ∼ x & (0xFF << ((sizeof(int)-1)<<3))) 1 Questão 3 (20 pontos) Resolva o problema 2.62 do livro texto. Resp.: int int_shifts_are_arithmetic() { int x = -1; /* todos os bits em 1 */ return (x >> 1) < 0; /* retorna 1 se shift é aritmético, pois terı́amos um número negativo e 0 caso contrário */ } Questão 4 (20 pontos) Resolva o problema 2.71 do livro texto. Resp.: A. (5) A função elaborada não executa a extensão de sinal. Assim, se formos extrair o byte 0 de 0xFF, obtemos 255, ao invés de -1. Este é o ponto básico. O deslocamento é lógico pelo fato do tipo packed t ser unsigned. B.(15) int xbyte(packed_t word, int bytenum) { int left = word << ((3-bytenum) << 3); /* posiciona o byte a ser extraı́do em MSB */ return left >> 24; /* desloca left à direita aritmeticamente 24 posic~ oes e retorna como inteiro */ } Questão 5 (20 pontos) Encontre a representação em ponto flutuante de -123,123. Resp.: 123 = 1111011 .123 = .000111110111110011101 (vou precisar apenas de 17 bits e terei que arredondar) 123,123 = 1.111011000111110111110011101 * 26 mantissa (23 bits) = 111011000111110111110011 (sem arrendondar) = 1101100011111011111010 (arredondado) sinal = 1 expoente = 6 +127 = 133 = 0x85 = 10000101 123,123 = 1100 0010 1111 0110 0011 1110 1111 1010 = 0xC2F63EFA 2