Execute o programa abaixo e explique o resultado.
#include <stdio.h>
void dump (void *p, int n) {
unsigned char *p1 = p;
while (n--) {
printf("%p - %02x\n", p1, *p1);
p1++;
}
}
int main (void) {
short l = -32765;
unsigned short k = 32771;
printf("l=%d, k=%u \n", l, k);
printf("dump de l: \n");
dump(&l, sizeof(l));
printf("dump de k: \n");
dump(&k, sizeof(k));
return 0;
}
Execute o programa abaixo e explique seu resultado.
#include <stdio.h>
int main (void) {
int x = -1;
unsigned int y = 2;
printf("x=%d, y=%d\n", x, y);
printf("x é menor do que y? %s\n", (x<y)?"sim":"nao");
return 0;
}
A linguagem C não especifica se o tipo char tem formato
com ou sem sinal.
Escreva um programa em C para descobrir como ele interpreta
um char.
A idéia básica é fazer algo que dê um determinado resultado
se o char for interpretado como um número com sinal,
e dê um resultado diferente se ele for interpretado sem sinal.
Para conferir seu programa, teste-o com os tipos
signed char e unsigned char
e verifique se os resultados são efetivamente diferentes.
Existem pelo menos duas maneiras "razoáveis" para a máquina
converter um número do formato signed char para o formato
unsigned int, e o resultado pode ser diferente.
Quais são essas maneiras?
Escreva um programa em C para descobrir como ele faz essa conversão. Não use conversões explicitas (type casting)
Dica 1: há duas conversões envolvidas ...
Dica 2: use os formatos %u e %x para exibir o unsigned int
Você pode usar conversões explícitas para verificar o resultado obtido caso a "outra maneira" fosse empregada. Tente!
Para números sem sinal a operação de "shift right"
(>>) corresponde a uma divisão por dois.
Essa correspondência continua existindo para números no formato
complemento a dois? (Dica: pense no valor que entra no bit
mais significativo quando o shift é feito.)
Faça um programa em C para verificar como ele faz o "shift right".
O resultado de i >> 1 pode depender da variável i
ser com ou sem sinal?
Dica: experimente com valores com e sem sinal, mostre antes e depois do shift em formato decimal e em hexa...