Uma variável inteira em C ocupa 2 bytes ou 4 bytes? Quais são os fatores de que depende?
A maioria dos livros diz que variáveis inteiras ocupam 2 bytes. Mas quando executo um programa que imprime os endereços sucessivos de uma matriz de números inteiros, ele mostra a diferença de 4.
int
é apenas um dos vários tipos inteiros . Você perguntou sobre o tamanho de "número inteiro"; você provavelmente quis perguntar sobre o tamanho deint
.int
é de 2 bytes (a) provavelmente se refere a um sistema antigo e (b) falha ao deixar claro que o tamanho varia de um sistema para outro. O melhor livro sobre C é "The C Programming Language", de Kernighan e Ritchie, apesar de assumir alguma experiência em programação. Veja também questionar 18.10 do FAQ comp.lang.c .#define int int64_t
em uma plataforma de 64 bits, então também não. Apenas usesizeof
. ;-)Respostas:
Eu sei que é igual a
sizeof(int)
. O tamanho de umint
é realmente dependente do compilador. Naquela época, quando os processadores tinham 16 bits, umint
era 2 bytes. Atualmente, costuma ter 4 bytes em sistemas de 32 bits e de 64 bits.Ainda assim, usar
sizeof(int)
é a melhor maneira de obter o tamanho de um número inteiro para o sistema específico em que o programa é executado.EDIT: Corrigida afirmação errada de
int
8 bytes na maioria dos sistemas de 64 bits. Por exemplo, são 4 bytes no GCC de 64 bits.fonte
sizeof(int)
pode ser qualquer valor de1
. Um byte não precisa ter 8 bits e algumas máquinas não possuem uma unidade endereçável de 8 bits (que basicamente é a definição de um byte no padrão). A resposta não está correta sem mais informações.Esse é um dos pontos em C que pode ser confuso no início, mas o padrão C especifica apenas um intervalo mínimo para tipos inteiros que são garantidos como suportados.
int
é garantido para poder manter -32767 a 32767, o que requer 16 bits. Nesse casoint
,, é de 2 bytes. No entanto, as implementações são livres para ir além desse mínimo, pois você verá que muitos compiladores modernos produzemint
32 bits (o que também significa 4 bytes de maneira bastante onipresente).O motivo pelo qual o livro diz 2 bytes provavelmente é porque é antigo. Ao mesmo tempo, essa era a norma. Em geral, você sempre deve usar o
sizeof
operador se precisar descobrir quantos bytes estão na plataforma que está usando.Para resolver isso, o C99 adicionou novos tipos onde você pode solicitar explicitamente um determinado número inteiro de tamanho, por exemplo
int16_t
ouint32_t
. Antes disso, não havia uma maneira universal de obter um número inteiro de uma largura específica (embora a maioria das plataformas fornecesse tipos semelhantes por plataforma).fonte
int
. C não faz essa suposição. Os sistemas de complemento e magnitude de sinal de 1 não podem representar-32768
em 16 bits; em vez disso, eles têm duas representações para zero (positivo e negativo). É por isso que o intervalo mínimo para umint
é[-32767..32767]
.Não há resposta específica. Depende da plataforma. É definido pela implementação. Pode ser 2, 4 ou outra coisa.
A idéia por trás
int
disso era que ela deveria corresponder ao tamanho natural da "palavra" na plataforma fornecida: 16 bits em plataformas de 16 bits, 32 bits em plataformas de 32 bits, 64 bits em plataformas de 64 bits, você entendeu. No entanto, para fins de compatibilidade com versões anteriores, alguns compiladores preferem manter os de 32 bits,int
mesmo em plataformas de 64 bits.O tempo de 2 bytes
int
já passou muito tempo (plataformas de 16 bits?), A menos que você esteja usando alguma plataforma incorporada com tamanho de palavra de 16 bits. Seus livros didáticos provavelmente são muito antigos.fonte
The idea behind int was that it was supposed to match the natural "word" size on the given platform
- Era isso que eu estava procurando. Alguma idéia de qual seja o motivo? Em um mundo livre, int poderia ocupar qualquer número de bytes consecutivos na memória, certo? 8, 16 qualquer que sejaA resposta a esta pergunta depende de qual plataforma você está usando.
Mas, independentemente da plataforma, você pode assumir com segurança os seguintes tipos:
fonte
Isso depende da plataforma que você está usando, bem como de como o seu compilador está configurado. A única resposta autorizada é usar o
sizeof
operador para ver o tamanho de um número inteiro na sua situação específica.É melhor considerar o intervalo , em vez do tamanho . Ambos variarão na prática, embora seja muito mais seguro escolher tipos de variáveis por faixa do que tamanho, como veremos. Também é importante observar que o padrão nos incentiva a considerar a escolha de nossos tipos inteiros com base no intervalo e não no tamanho , mas por enquanto vamos ignorar a prática padrão e deixar nossa curiosidade explorar
sizeof
, bytes eCHAR_BIT
representação de números inteiros ... a toca do coelho e ver por nós mesmos ...sizeof
, bytes eCHAR_BIT
A declaração a seguir, tirada do padrão C (vinculado acima), descreve isso em palavras que eu acho que não podem ser melhoradas.
Assumir um entendimento claro nos levará a uma discussão sobre bytes . É comum presumir que um byte tem oito bits, quando na verdade
CHAR_BIT
informa quantos bits há em um byte . Essa é apenas mais uma daquelas nuances que não são consideradas quando se fala dos inteiros comuns de dois (ou quatro) bytes .Vamos encerrar as coisas até agora:
sizeof
=> tamanho em bytes eCHAR_BIT
=> número de bits em bytePortanto, dependendo do seu sistema,
sizeof (unsigned int)
pode haver qualquer valor maior que zero (não apenas 2 ou 4), como seCHAR_BIT
fosse 16, então um único byte (dezesseis bits) possui bits suficientes para representar o número inteiro de dezesseis bits descrito pelo padrões (citados abaixo). Isso não é necessariamente uma informação útil, é? Vamos nos aprofundar mais ...Representação inteira
O padrão C especifica a precisão / intervalo mínimo para todos os tipos de números inteiros padrão (e
CHAR_BIT
também fwiw) aqui . A partir disso, podemos derivar um mínimo para quantos bits são necessários para armazenar o valor , mas também podemos escolher nossas variáveis com base nos intervalos . No entanto, grande parte dos detalhes necessários para esta resposta reside aqui. Por exemplo, o seguinteunsigned int
requer que o padrão exija (pelo menos) dezesseis bits de armazenamento:Assim, podemos ver que
unsigned int
exigem ( pelo menos ) 16 bits , que é onde você obtém os dois bytes (assumindo queCHAR_BIT
é 8) ... e mais tarde, quando esse limite aumentou para2³² - 1
, as pessoas estavam declarando 4 bytes. Isso explica os fenômenos que você observou:Você está usando um livro antigo e um compilador que ensina C não portátil; o autor que escreveu seu livro pode nem estar ciente
CHAR_BIT
. Você deve atualizar seu livro (e compilador) e se esforçar para lembrar que a TI é um campo em constante evolução e que você precisa ficar à frente para competir ... Porém, basta; vamos ver quais outros segredos não portáteis esses bytes inteiros subjacentes armazenam ...Os bits de valor são o que os equívocos comuns parecem contar. O exemplo acima usa um
unsigned
tipo inteiro que normalmente contém apenas bits de valor, por isso é fácil perder o diabo nos detalhes.Assinar bits ... No exemplo acima, citei
UINT_MAX
como sendo o limite superiorunsigned int
porque é um exemplo trivial extrair o valor16
do comentário. Para tipos assinados, para distinguir valores positivos e negativos (esse é o sinal), precisamos incluir também o bit do sinal.Preenchimento de bits ... Embora não seja comum encontrar computadores com bits de preenchimento em números inteiros, o padrão C permite que isso aconteça; algumas máquinas (isto é, esta ) implementam tipos inteiros maiores combinando dois valores inteiros menores (assinados) juntos ... e quando você combina números inteiros assinados, obtém um bit de sinal desperdiçado. Esse bit desperdiçado é considerado preenchimento em C. Outros exemplos de bits de preenchimento podem incluir bits de paridade e bits de trap .
Como você pode ver, o padrão parece encorajar a consideração de intervalos como
INT_MIN
...INT_MAX
e outros valores mínimos / máximos do padrão ao escolher tipos inteiros e desencoraja a dependência de tamanhos, pois existem outros fatores sutis que podem ser esquecidos, comoCHAR_BIT
bits de preenchimento que pode afetar o valor desizeof (int)
(ou seja, os equívocos comuns de números inteiros de dois e quatro bytes ignoram esses detalhes).fonte
Rascunho padrão C99 N1256
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
O tamanho
int
e todos os outros tipos de números inteiros são definidos por implementação, C99 especifica apenas:5.2.4.2.1 "Tamanhos de tipos inteiros
<limits.h>
" fornece os tamanhos mínimos:6.2.5 "Tipos" diz então:
e 6.3.1.1 "Boolean, caracteres e números inteiros" determina os graus de conversão relativos:
fonte
As únicas garantias são que
char
devem ter pelo menos 8 bits de largurashort
eint
devem ter pelo menos 16 bits de largura elong
devem ter pelo menos 32 bits de largura e quesizeof (char)
<=sizeof (short)
<=sizeof (int)
<=sizeof (long)
(o mesmo vale para as versões não assinadas desses tipos )int
pode ter de 16 a 64 bits de largura, dependendo da plataforma.fonte
A resposta é "sim" / "não" / "talvez" / "talvez não".
A linguagem de programação C especifica o seguinte: a menor unidade endereçável, conhecida por
char
e também chamada de "byte" , possui exatamenteCHAR_BIT
bits de largura, ondeCHAR_BIT
é pelo menos 8.Portanto, um byte em C não é necessariamente um octeto , ou seja, 8 bits. No passado, uma das primeiras plataformas a rodar código C (e Unix) tinha 4 bytes
int
- mas no totalint
tinha 36 bits, porqueCHAR_BIT
era 9!int
é suposto ser o tamanho inteiro natural da plataforma que tem um alcance de pelo menos-32767 ... 32767
. Você pode obter o tamanho deint
nos bytes da plataforma comsizeof(int)
; quando você multiplicar esse valorCHAR_BIT
, saberá a largura em bits.Enquanto as máquinas de 36 bits estão praticamente inoperantes, ainda existem plataformas com bytes que não são de 8 bits. Ainda ontem, havia uma pergunta sobre um MCU da Texas Instruments com bytes de 16 bits , que possui um compilador compatível com C99, C11.
Em TMS320C28x parece que
char
,short
eint
são todos os 16 bits de largura, e, portanto, um byte.long int
é de 2 bytes elong long int
é de 4 bytes. A beleza de C é que ainda é possível escrever um programa eficiente para uma plataforma como essa e até fazê-lo de maneira portátil!fonte
Principalmente depende da plataforma que você está usando. Depende de compilador para compilador. Atualmente, na maioria dos compiladores, int é de 4 bytes . Se você quiser verificar o que seu compilador está usando, você pode usar
sizeof(int)
.A única coisa que a promessa do compilador c é que o tamanho de short deve ser igual ou menor que int e o tamanho de long deve ser igual ou maior que int.Portanto, se o tamanho de int for 4, o tamanho de short poderá ser 2 ou 4, mas não maior O mesmo vale por muito tempo e int. Também diz que tamanho de curto e longo prazo não pode ser o mesmo.
fonte
%d
de umsize_t
parâmetro é UB.Isso depende da implementação, mas geralmente o x86 e outras arquiteturas populares como ARMs
int
levam 4 bytes. Você sempre pode verificar no momento da compilação usandosizeof(int)
ou qualquer outro tipo que queira verificar.Se quiser usar um tipo de tamanho específico, use os tipos em
<stdint.h>
fonte
Isso retorna 4, mas provavelmente depende da máquina.
fonte
C permite que "bytes" sejam algo diferente de 8 bits por "byte".
Um valor de algo que 8 é cada vez mais incomum. Para máxima portabilidade, use em
CHAR_BIT
vez de 8. O tamanho de umint
em bits em C ésizeof(int) * CHAR_BIT
.O
int
tamanho do bit geralmente é de 32 ou 16 bits. C intervalos mínimos especificados :O intervalo mínimo para
int
força o tamanho do bit a pelo menos 16 - mesmo que o processador seja "8 bits". Um tamanho de 64 bits é visto em processadores especializados. Outros valores como 18, 24, 36 etc. ocorreram em plataformas históricas ou são pelo menos teoricamente possíveis. A codificação moderna raramente se preocupa comint
tamanhos de bit sem potência de 2 .O processador e a arquitetura do computador conduzem a
int
seleção de tamanho de bit.No entanto, mesmo com processadores de 64 bits, o
int
tamanho do compilador pode ser de 32 bits por motivos de compatibilidade, já que grandes bases de código dependem deint
32 bits (ou 32/16).fonte
Essa é uma boa fonte para responder a essa pergunta.
Mas essa pergunta é uma espécie de resposta sempre verdadeira "Sim. Ambos".
Depende da sua arquitetura. Se você estiver trabalhando em uma máquina de 16 bits ou menos, não poderá ter 4 bytes (= 32 bits). Se você estiver trabalhando em uma máquina de 32 bits ou superior, seu comprimento será de 32 bits.
Para descobrir, prepare seu programa para produzir algo legível e use a função "sizeof". Isso retorna o tamanho em bytes do seu tipo de dados declarado. Mas tenha cuidado ao usar isso com matrizes.
Se você estiver declarando,
int t[12];
ele retornará 12 * 4 bytes. Para obter o comprimento dessa matriz, basta usarsizeof(t)/sizeof(t[0])
. Se você for criar uma função, que calcule o tamanho de uma matriz de envio, lembre-se de que, sePortanto, isso nem retornará algo diferente. Se você definir uma matriz e tentar obter o comprimento posteriormente, use sizeof. Se você enviar uma matriz para uma função, lembre-se de que o valor de envio é apenas um ponteiro no primeiro elemento. Mas no primeiro caso, você sempre sabe qual é o tamanho da sua matriz. O caso dois pode ser definido definindo duas funções e perdendo algum desempenho. Defina a função (matriz t) e defina a função2 (matriz t, int size_of_t). A chamada "function (t)" mede o comprimento de algumas cópias e envia o resultado para function2, onde você pode fazer o que quiser em tamanhos de matriz variáveis.
fonte
char
é sempresigned
)