Programação Progressiva
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
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

2 participantes

Ir para baixo  Mensagem [Página 1 de 1]

Glederson



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!!!

Glederson



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?

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.

https://progressiva.forumeiros.com

Conteúdo patrocinado



Ir para o topo  Mensagem [Página 1 de 1]

Permissões neste sub-fórum
Não podes responder a tópicos