Programação Progressiva

Fórum para dúvidas dos sites: Programação Progressiva, Java Progressivo, C Progressivo


Você não está conectado. Conecte-se ou registre-se

Dúvidas sobre quantidade de memória armazenada

Ver o tópico anterior Ver o tópico seguinte Ir em baixo  Mensagem [Página 1 de 1]

Olá... estou começando a estudar a apostila online, e surgiu algumas dúvidas quanto aos tipos de variáveis:
No link "Modificadores do tipo inteiro - short, long, signed e unsigned "
fiz o exercício pra ver o tamanho das variáveis e o algoritmo ficou assim:

#include <stdio.h>
int main()
{
   printf("int : %d bytes\n", sizeof( int ) );
   printf("short int: %d bytes\n", sizeof( short ) );
   printf("long int: %d bytes\n", sizeof( long ) );
   printf("signed int : %d bytes\n", sizeof( signed int ) );
   printf("short signed int: %d bytes\n", sizeof( signed short ) );
   printf("long signed int: %d bytes\n", sizeof( signed long ) );
   printf("unsigned int : %d bytes\n", sizeof( unsigned int ) );
   printf("short unsigned int: %d bytes\n", sizeof( unsigned short ) );
   printf("long unsigned int: %d bytes\n", sizeof( unsigned long ) );
}

Mas o resultado não foi como eu esperava, pois a mesma memória foi reserva pra signed e unsigned,
veja o print na tela:

int : 4 bytes
short int: 2 bytes
long int: 4 bytes
signed int : 4 bytes
short signed int: 2 bytes
long signed int: 4 bytes
unsigned int : 4 bytes
short unsigned int: 2 bytes
long unsigned int: 4 bytes

Process returned 27 (0x1B)   execution time : 0.008 s
Press any key to continue.

unsigned não deveria reservar menos memória? Sabe me dizer o que houve?

Aguardo a resposta!!!

Ver perfil do usuário
Mais um detalhe...
Fui fazer um teste com raiz de 3 usando float e double:

#include <stdio.h>

int main()
{
   float fr3;
   double dr3;
   fr3 = sqrt(3);
   dr3 = sqrt(3);
   printf("Raiz de 3 com float = %.16f\n", fr3 );
   printf("Raiz de 3 com double = %.16f\n", dr3 );
}

Veja o resultado:

Raiz de 3 com float = 1.7320507764816284
Raiz de 3 com double = 1.7320508075688772

Process returned 42 (0x2A)   execution time : 0.020 s
Press any key to continue.

Pode me dizer o que houve?

Ver perfil do usuário

Admin


Admin
Olá Glederson,

É realmente complicado dizer quanto cada tipo deve, de fato ocupar, em memória, pois isso depende muito de cada hardware. E o que vemos hoje no mercado é uma variação gigantesca de processadores.

Mas das máquinas que testei, realmente unsigned int ocupa o espaço normal de um inteiro, a diferença é na faixa de valores que podem assumir.

O inteiro normal, de 4 bytes, pode armazenar números entre -2 147 483 648 e +2 147 483 647
Porém, o unsigned não trabalha com números negativos. Hora, se os negativos não vão servir de nada, vamos aproveitar esse espaço em memória para poder armazenar uma faixa maior de números positivos.

Então o unsigned int pode armazenar números entre 0 a +4 294 967 295
Ou seja, é como se a gente pegasse a capacidade do int de armazenar negativos em memória, e usasse pra armazenar um positivo maior.

Sobre o float e double, confie mais no double, pois ele tem uma precisão que é o dobro (double) da do float.
A precisão do float é bem curta, e fazendo .16f você obriga ele a te dar uma precisão de 16 casas decimais, que dependendo da arquitetura do seu hardware, pode ser que você esteja exigindo muito do float, que não tem precisão tão grande assim, então ele tenta fazer o que dá.

Os resultados vão dar diferente mesmo, pois a capacidade do double é maior, então sua precisão vai ser maior que o float, então deve dar diferente mesmo (no caso, mais preciso pro double).
Afinal, se o resultado desse o mesmo, para tantas casas decimais, usaríamos sempre o float, pois ocuparia menos memória e teria a mesma precisão do doble. Concorda?

Abraços.

Ver perfil do usuário http://progressiva.forumeiros.com

Conteúdo patrocinado


Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo  Mensagem [Página 1 de 1]

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum