Por que curto, int e muito inventado em C?


16

Estou tendo dificuldade para entender, quais foram os propósitos exatos de criar o short, inte longtipos de dados em C?

A razão pela qual pergunto é que não parece que seus tamanhos são limitados - eles podem ser de qualquer tamanho, desde que shortsejam menores que um int, por exemplo.

Em quais situações, então, você deve usar um unsigned intou unsigned long, por exemplo, em vez de um size_t, ao fazer isso não oferece esperança de compatibilidade binária?

(Se você não souber o tamanho, como saberá quando escolher qual?)


2
Confira<stdint.h>
BlackJack 20/10

1
@BlackJack: Haha, sim, eu realmente tenho - mas acho que minha pergunta é: por que todos esses tipos não são definidos nativamente? É uma questão "retrospectiva é 20/20" ou houve um motivo específico?
user541686

2
C era para ser portátil e próximo ao hardware subjacente. Havia plataformas em que o byte não tinha 8 bits - mas você ainda podia usar C. Nenhum conjunto fixo de tipos de dados seria suficiente, nenhum número inteiro de tamanho fixo poderia ser portátil.
SK-logic

@ SK-logic: Nem mesmo se eles disseram sizeof(short) == 2 * sizeof(char)ou similar?
user541686

1
Existem plataformas onde sizeof(char) == sizeof(short), e isso faz sentido. Infelizmente, não há como especificar tipos de números integrais para que eles se ajustem a todas as plataformas possíveis e existentes.
SK-logic

Respostas:


12

Seria definido pela arquitetura que você estava usando. Em um chip Zilog z80 (chip embutido comum), eles teriam um tamanho, enquanto poderiam ter um tamanho totalmente diferente em um chipset x86. No entanto, os tamanhos são proporções fixas entre si. Essencialmente curtos e longos não são tipos, mas se qualificam para o tipo int. Entradas curtas serão uma ordem de magnitude menor que int (regular) e as entradas longas serão uma ordem de magnitude maior. Assim, digamos que seu Int esteja limitado a 4 bytes, o qualificador curto o limita a 4 bytes, embora 2 bytes também seja muito comum e o qualificador longo o potencialize potencialmente para 8 bytes, embora possa ser menor que 4 bytes. Lembre-se de que isso também está sujeito ao tamanho da palavra; portanto, em um sistema de 32 bits, você atingirá o máximo de 4 bytes por int, tornando o mesmo que um int regular. Assim, Curto ≤ Int ≤ Longo.

No entanto, se você prolongá-lo novamente, poderá enviar o int para a próxima célula, fornecendo 8 bytes de armazenamento inteiro. Esse é o tamanho da palavra para máquinas de 64 bits, para que elas não precisem se preocupar com essas coisas e apenas use a célula para polegadas longas, permitindo que elas sejam outra ordem acima das polegadas padrão, enquanto as longas e compridas ficam realmente pequenas.

Quanto à escolha, tudo se resume a algo com que os programadores Java, por exemplo, não precisam se preocupar. "Qual é a sua arquitetura?" Como tudo depende do tamanho da palavra da memória da máquina em questão, você precisa entender isso antes de decidir qual usar. Você escolhe o menor tamanho razoável para economizar o máximo de memória possível, porque essa memória será alocada, independentemente de você usar todos os bits nela ou não. Assim, você salva onde pode e escolhe shorts quando pode e ints quando não pode e se precisar de algo maior do que as ints regulares que você dá; você aumentaria conforme necessário até atingir a palavra teto. Você precisará fornecer rotinas de grande número ou obtê-las de uma biblioteca.

C pode muito bem ser "montagem portátil", mas você ainda precisa conhecer o seu hardware.


11
isso não está certo, os shorts não precisam ser menores que ints, eles não podem ser maiores que ints
jk.

Eu vou corrigir isso.
Engenheiro Mundial

2
Da mesma forma, longs não podem ser menores que ints.
Donal Fellows

1
de fato, acredito que houve máquinas onde curtas, int e longas são exatamente iguais.
jk.

6

Embora hoje, um "byte" signifique "8 bits", isso nem sempre foi verdade. As máquinas usaram pedaços endereçáveis ​​de 4 bits, 8 bits, 12 bits, 16 bits, 32 bits e 36 bits (e provavelmente alguns outros tamanhos também). Uma das intenções de design de C era poder ser usada em máquinas com diferentes tamanhos e configurações de memória.

Eu acho que a intenção do projeto era originalmente que cada tipo intfosse a menor coisa que pudesse lidar com números de vários tamanhos, e que intfosse o tamanho "de uso geral" mais prático que pudesse lidar com +/- 32767. Acho que não havia nenhum desejo ou intenção de criar uma linguagem que ainda estivesse em uso quando os computadores se tornassem tão poderosos que operações em números de 64 bits custam o mesmo que operações em números menores.

O maior problema com a semântica de tipo inteiro de C é que, em alguns contextos, eles representam números cardinais ou números matemáticos, enquanto em outros contextos são usados ​​para representar membros de um anel algébrico abstrato envolvente de números inteiros congruentes mod 2 ^ n [por exemplo, subtraindo o valor máximo representável de 0 é definido para gerar 1], mas os comportamentos são especificados mais com base no que os compiladores pareciam fazer nos dias em que o tamanho das palavras do computador era de cerca de 16 bits (e um tamanho de palavra de 36 bits seria enorme ), e não com base no que faria sentido em uma máquina de 64 bits. Conseqüentemente, o resultado da subtração de um valor não assinado de 32 bits de um valor menor de 32 bits não assinado pode ser um grande valor não assinado de 32 bits ou um número negativo de 64 bits.


4

/programming/589575/size-of-int-long-etc

Portanto, nas arquiteturas mais usadas, char é 1 byte, short e int são pelo menos 2 bytes e long são pelo menos 4 bytes.

E pretende-se que 'int' seja a representação mais natural / normal / eficiente para a CPU atual.

Portanto, a regra geral é usar 'int', a menos que seus valores excedam +/- 32K, fazendo você (em CPUs mais antigas) usar 'long'. ... ou a menos que você esteja criando grandes matrizes de valores pequenos (<32K) e a memória seja um problema - então você usaria 'short' para economizar memória (ou talvez 'char' ou 'byte').


2
Mas com 64 bits, intdificilmente é uma boa escolha, certo? Eu quase sempre acabo usando size_t(ou até mesmo ptrdiff_t!) De qualquer maneira, para evitar problemas com a portabilidade do código.
user541686

@Merhdad - int usado para a melhor escolha, foi definido como a 'unidade padrão' do HW e, geralmente, o tamanho de um ponteiro. Atualmente, use size_t por segurança.
Martin Beckett

1

O C foi projetado para lidar ativamente com a memória em diferentes níveis. Existem casos em que a diferença entre short, int e long, e entre float e double, é importante devido a restrições de memória, arquitetura etc. casos em que os dados são massivos) e a transição de arquiteturas principalmente de 32 bits para 64 bits torna isso um problema novamente. (Em dez ou vinte anos, quando fizermos a transição para arquiteturas de 128 bits e o C / C ++ ainda for popular, será um problema novamente). Você está certo de que a compatibilidade binária sofre, e é por isso que você não deseja usar esses tamanhos de tipo de variável onde isso importa.

Você perguntou como saberia qual usar se não souber o tamanho, mas sabe o tamanho em uma combinação de arquitetura / compilador e, se precisar otimizar a memória nesse nível, é melhor conhecê-lo. Você não pode otimizá-lo simplesmente entre plataformas, porque não sabe o tamanho delas; portanto, não deseja usar esses recursos para esse fim. Mas muitas coisas escritas em C são específicas da plataforma, que, apesar da moda para "plataforma cruzada", permitem algumas otimizações vantajosas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.