Dificuldade em declarar integer (Tamanho da variável) [RESOLVIDO]

1. Dificuldade em declarar integer (Tamanho da variável) [RESOLVIDO]

Mr.Perfection
perfection

(usa Slackware)

Enviado em 07/03/2020 - 13:59h

OBS
Isso não é um exercício, estou apenas querendo entender para aprender mais.
Em algum lugar na Internet, Eu salvei o comando sizeof como forma de saber o tamanho que ocupa uma variável.
Porém HOJE ao tentar usá-lo não está me parecendo correto, visto que retorna valores diferentes do que EU esperava.

EM C, Eu entendi que:
int ocupa 2 Bytes (números inteiros de -32768 a 32767)
long ou long int ocupa 4 Bytes (números inteiros de -65536 a 65535)

PROBLEMA

No pequeno programa que fiz abaixo ele está me retornando valores diferentes do que EU esperava.
#include <stdio.h>
int main(void) {
int A = 17;
long B = 20;
long int C = 27;
printf ("A possue %d Bytes\n", sizeof(A)); // A possue 4 Bytes | Esperava que ele retorna-se 2 Bytes
printf ("B possue %d Bytes\n", sizeof(B)); // B possue 8 Bytes | Esperava que ele retorna-se 4 Bytes
printf ("C possue %d Bytes\n", sizeof(C)); // C possue 8 Bytes | Esperava que ele retorna-se 4 Bytes
}

OBS Compilei da forma mais simples possível: gcc Test.c -o Test
RESUMO
Ele está retornando o DOBRO do valor que eu esperava! O que aconteceu?
O que estou fazendo de errado?
Estou usando o comando "sizeof" corretamente?
O comando "sizeof" é o correto para saber quanto uma variável está ocupando na memória?


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/03/2020 - 22:57h

O tamanho de cada tipo de dado é dependente da arquitetura do computador em questão. O padrão do C não tem regras muito rígidas com relação a esses tipos de dados, limitando-se, geralmente, a exigir apenas algumas características mínimas, o que permite a cada implementação escolher o que for melhor em termos de flexibilidade e desempenho para o sistema alvo.

Por definição, sizeof(char) é sempre igual a 1, e um dado do tipo char ocupa o menor tamanho de memória que o computador consiga endereçar, desde que esse bloco de memória tenha pelo menos 8 bits. Nos nossos PCs (e na maioria das máquinas de uso comum de que eu tenho notícia), um char tem exatamente 8 bits e é realmente a menor quantidade de memória endereçável.

O tipo int também não é definido de modo exato e universal, mas recomenda-se que ele tenha o tamanho de dados nativo do computador que ofereça o melhor desempenho, desde que possa representar valores com um mínimo de 16 bits. Em PCs que rodavam MS-DOS, 16 bits era justamente o tamanho nativo do maior dado inteiro que o processador conseguia manipular numa única operação. Outros computadores, cujo processador tinha operações com apenas 8 bits, precisavam sintetizar dados do tipo int através da composição de múltiplos bytes e decompor operações (tais como somas, subtrações e operações bit-a-bit) em sucessivas operações com as partes menores. Por outro lado, máquinas mais parrudas, como nossos PCs atuais, que possuem processadores e sistemas operacionais de 32 ou 64 bits, podem usar operações nativas com essa precisão a mais, sem perda de desempenho, e, por isso, geralmente preferem usá-la. Ao fazê-lo, continuam atendendo os requisitos mínimos do padrão do C.

Outros tipos, tais como long int ou short int, são ainda mais flexíveis. O padrão diz pouco sobre eles, especificando pouco mais do que a seguinte relação de tamanhos.
sizeof(char)<=sizeof(short int)<=sizeof(int)<=sizeof(long int) 


(Continua...)


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)

3. Re: Dificuldade em declarar integer (Tamanho da variável)

Stanislaus K
StanislausK

(usa FreeBSD)

Enviado em 08/03/2020 - 10:19h

Ola,

eu aprendi que em C:

short int ocupa 16 bits, podendo armazenar valores de -32.768 a 32.767.

int ocupa 32 bits, podendo armazenar valores de -2.147.483.648 a 2.147.483.647.

long int ocupa 64 bits, podendo armazenar valores de -9 × 10^18 a aprox. 9 × 10^18.





4. Re: Dificuldade em declarar integer (Tamanho da variável) [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/03/2020 - 15:36h

StanislausK escreveu:

Ola,

eu aprendi que em C:

short int ocupa 16 bits, podendo armazenar valores de -32.768 a 32.767.

int ocupa 32 bits, podendo armazenar valores de -2.147.483.648 a 2.147.483.647.

long int ocupa 64 bits, podendo armazenar valores de -9 × 10^18 a aprox. 9 × 10^18.


Esses valores que você coloca são de uma implementação particular. Você tem de tomar cuidado de não generalizar o que é específico.

Só para você ter uma ideia, os compiladores de 64 bits da Microsoft utilizam a mesma representação para int e para long int, assim como faziam seus compiladores de 32 bits. O GCC, por outro lado, utiliza, nos compiladores de 64 bits para PCs, 32 bits para int e 64 bits tanto para long int e long long int.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts