Perchè erano brevi, int e lunghi inventati in C?

16

Ho difficoltà a capire, quali erano gli scopi esatti della creazione dei tipi di dati short , int e long in C?

Il motivo per cui lo chiedo è che non sembra che le loro dimensioni siano limitate, potrebbero essere di qualsiasi dimensione, a condizione che short sia più piccolo di int , ad esempio.

In quali situazioni, quindi, dovresti usare un unsigned int o unsigned long , ad esempio, invece di un size_t , se così facendo non offri speranze di compatibilità binaria?

(Se non conosci la dimensione, come sapresti quando scegliere quale?)

    
posta Mehrdad 20.10.2011 - 03:05
fonte

4 risposte

12

Sarebbe definito dall'architettura che stavi usando. Su un chip Zilog z80 (chip incorporato comune) avrebbero una dimensione mentre potevano essere una dimensione completamente diversa su un chipset x86. Tuttavia, le dimensioni stesse sono rapporti fissi tra loro. Essenzialmente brevi e lunghi non sono tipi ma si qualificano per il tipo int. Gli intervalli brevi saranno di un ordine di grandezza inferiore a (normale) int e quelli lunghi saranno di un ordine di grandezza superiore. Quindi, il tuo Int è limitato a 4 byte, il qualificatore breve lo limita a 4 byte sebbene 2 byte sia anche molto comune e il qualificatore lungo lo potenzia potenzialmente a 8 byte anche se può essere inferiore a 4 byte. Tieni presente che anche questo è soggetto alla lunghezza della parola, quindi su un sistema a 32 bit il limite massimo è di 4 byte per l'int iniziale, il che equivale a un normale int. Quindi, Short ≤ Int ≤ Long.

Tuttavia, se lo allunghi di nuovo, puoi inserire l'int alla cella successiva dandoti 8 byte interi di memoria. Questa è la dimensione della parola per le macchine a 64 bit, quindi non devono preoccuparsi di queste cose e basta usare una cella per i long ints permettendo loro di essere un altro ordine al di sopra degli standard, mentre i long long int sono davvero poco.

Per quanto riguarda la scelta, si riduce a qualcosa che i programmatori Java, per esempio, non devono preoccuparsi. "Qual è la tua architettura?" Dal momento che tutto dipende dalla dimensione della parola della memoria della macchina in questione, devi capirlo prima di decidere quale usare. Quindi scegli le dimensioni ragionevoli più piccole per risparmiare quanta più memoria possibile perché la memoria verrà assegnata indipendentemente dal fatto che tu utilizzi tutti i bit o meno. Quindi salva dove puoi e scegli i pantaloncini quando puoi e quando non puoi e se hai bisogno di qualcosa di più grande di quello che intendi di solito; avresti allungato quanto necessario fino a quando non hai raggiunto il limite massimo. Quindi dovrai fornire grandi numeri di routine o recuperarli da una libreria.

C potrebbe benissimo essere un "assembly portatile", ma devi comunque conoscere il tuo hardware.

    
risposta data 20.10.2011 - 03:26
fonte
6

Anche se oggi, un "byte" significa "8 bit", che non è sempre stato vero. Le macchine hanno utilizzato blocchi indirizzabili di 4 bit, 8 bit, 12 bit, 16 bit, 32 bit e 36 bit (e probabilmente anche altri formati). Una delle intenzioni progettuali di C doveva essere utilizzabile su macchine con diverse dimensioni e configurazioni di memoria.

Penso che originariamente l'intenzione progettuale fosse che ogni tipo diverso da int fosse la cosa più piccola che potesse gestire numeri di varie dimensioni e che int fosse la dimensione più pratica "general-purpose" che potesse gestire + / -32767. Non credo ci fosse alcun desiderio o intenzione di creare un linguaggio che sarebbe ancora in uso quando i computer diventavano così potenti che le operazioni su numeri a 64 bit costano come le operazioni su quelle più piccole.

Il problema più grande con la semantica di tipo intero di C è che in alcuni contesti rappresentano numeri cardinali o interi matematici, mentre in altri contesti sono usati per rappresentare membri di un anello algebrico astratto di interi congruenti mod 2 ^ n [ quindi ad es sottraendo il massimo valore rappresentabile da 0 è definito per produrre 1], ma i comportamenti sono specificati più sulla base di ciò che i compilatori sembravano fare i giorni in cui le dimensioni delle parole del computer erano di circa 16 bit (e una dimensione di parola di 36 bit sarebbe stata enorme), piuttosto che sulla base di ciò che avrebbe senso su una macchina a 64 bit. Di conseguenza, il risultato della sottrazione di un valore senza segno a 32 bit da un valore a 32 bit senza segno più piccolo può essere un valore senza segno a 32 bit o un numero a 64 bit negativo.

    
risposta data 07.05.2014 - 01:33
fonte
4

link

Quindi nelle architetture più usate, char è 1 byte, short e int sono almeno 2 byte e long è almeno 4 byte.

Ed è inteso che 'int' dovrebbe essere la rappresentazione più naturale / normale / efficiente per la CPU corrente.

Quindi la regola generale è usare 'int' a meno che i tuoi valori non superino i +/- 32K, facendo sì che (su CPU più datate) usi 'long'. ... o se non stai realizzando grandi matrici di valori piccoli (< 32K) e la memoria è un problema, quindi useresti "short" per risparmiare memoria (o forse "char" o "byte").

    
risposta data 20.10.2011 - 04:45
fonte
1

C è stato progettato per gestire attivamente la memoria a diversi livelli. Ci sono casi in cui la differenza tra breve, int e lungo, e tra galleggiante e doppio, dipendeva da vincoli di memoria, architettura, ecc. Anche se ora conta meno, ci sono ancora ambienti in cui si trova (ad esempio, incorporato e in casi in cui i dati sono enormi) e il passaggio da architetture principalmente a 32 bit a 64 bit lo rende di nuovo un problema. (Tra dieci o venti anni quando passeremo a architetture a 128 bit e C / C ++ è ancora popolare, sarà di nuovo un problema). Hai ragione anche se la compatibilità binaria soffre, ed è per questo che non vuoi usare queste dimensioni di tipo variabile dove ciò è importante.

Hai chiesto come sapresti quale usare se non conosci la dimensione, ma conosci la dimensione di una determinata combinazione architettura / compilatore e se hai bisogno di ottimizzare la memoria a quel livello, faresti meglio a lo so. Non è possibile ottimizzarlo solo su piattaforme perché non si conoscono le loro dimensioni, quindi non si vorrebbe usare quelle funzionalità per quello scopo. Ma molte cose scritte in C sono specifiche della piattaforma, che, nonostante la moda per "cross platform", consente alcune ottimizzazioni vantaggiose.

    
risposta data 20.10.2011 - 16:54
fonte

Leggi altre domande sui tag