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