Perché esiste un limite per i tipi di dati

2

So che un int ad esempio ha un valore massimo di 2,147,483,647 ed è memorizzato in 4 slot di memoria (ogni 8 bit e un totale di 32 bit o semplicemente una parola).

Int può essere caricato correttamente in un registro a 32 bit. Se stiamo usando più piccoli Il registro conta come un microcontrollore a 8 bit, il int sarà diviso in 4 registri.

Ora la domanda è, dal momento che entrambe le allocazioni RAM e Register sono dinamiche (stiamo usando 4 slot di memoria in questo caso), perché abbiamo anche limiti per i tipi di dati?

Invece di usare 4 slot di memoria, perché non usiamo 5 o 6 o N (lo stesso con il registro della CPU). Perché non permettiamo tipi di dati con bit infiniti purché possano riempire l'intera RAM / registro?

    
posta Josh l 15.09.2018 - 20:49
fonte

5 risposte

11

Hai ragione, a volte può essere fastidioso (in rari casi, ad essere onesti) occuparsi di numeri fissi. Ma non preoccuparti: al giorno d'oggi, la maggior parte dei linguaggi di programmazione può gestire numeri illimitati in un modo o nell'altro.

Quindi perché abbiamo ancora (e usiamo nel 99% di tutti i casi) numeri di dimensioni fisse?

Principalmente, è perché le istruzioni fondamentali della macchina CPU funzionano con numeri di dimensioni fisse, quindi le dimensioni fisse offrono le migliori prestazioni. Poiché la maggior parte dei numeri che rappresentiamo tipicamente nel software si adatta bene all'intervallo di +/- 2 miliardi del tipo di dati a 32 bit, raramente ho bisogno di un tipo di dati di lunghezza maggiore o addirittura variabile.

    
risposta data 15.09.2018 - 21:30
fonte
4

Avere tipi di interi a dimensione fissa, in genere corrispondenti alle modalità di istruzione della CPU, è molto più semplice che fornire tipi interi a larghezza variabile.

L'aggiunta di due interi a 32 bit è in genere una singola istruzione CPU. L'aggiunta di due interi di larghezza arbitraria richiede in genere un supporto software sofisticato, compresa l'allocazione dinamica della memoria e la deallocazione. Vedi la GMP GNU Multiple Precision Arithmetic Library per un esempio. (È una libreria C, quindi in effetti puoi fare più aritmetica di precisione in C.)

Alcuni linguaggi (Python, ad esempio) forniscono interi incorporati della larghezza arbitraria - ma il compilatore, l'interprete o la libreria di runtime per tale linguaggio devono implementarlo.

E l'aritmetica dei numeri interi a dimensione fissa viene utilizzata nell'implementazione di queste librerie di precisione multiple.

Per inciso, C richiede che l'intervallo di int sia almeno -32767 .. +32767 (16 bit) e un "byte" sia di almeno 8 bit, ma può essere più. Le implementazioni C più moderne hanno unint di 32 bit, ma non è richiesto dalla lingua.

    
risposta data 04.10.2018 - 00:17
fonte
2

Questa risposta si basa sulla risposta di Ralf Kleberhoff e cerca di indirizzare specificamente C.

Per prima cosa, leggi su aritmetica arbitraria di precisione su Wikipedia. Per dirla semplicemente, è possibile:

  • Per una libreria software riutilizzabile per fornire bignums di dimensioni fisse, come numeri interi a 64 bit, numeri interi a 128 bit, numeri interi a 256 bit, ecc. e bignari di dimensioni arbitrarie, dove la quantità di memoria necessaria per memorizzare il valore è allocata dinamicamente in base a quanto è grande il valore, dal risultato del calcolo o dalla copia.
  • Per un linguaggio di programmazione fornire lo stesso e integrato nella sintassi del linguaggio stesso - in modo che anche gli operatori "+" "-" "*" "/" funzionino con bignums, ad esempio.
  • Per un linguaggio di programmazione specificare una "libreria standard" standardizzata e fornita con la lingua. Questa libreria standard è talvolta chiamata "la libreria di runtime" del linguaggio di programmazione.

Per alcuni linguaggi di programmazione moderni, la scelta tipica è la terza: includere tali strutture bignum come una libreria standard fornita con la lingua.

Alcuni altri linguaggi di programmazione (non così moderni, ma molto avanzati e in anticipo sui tempi) hanno già implementato la seconda scelta - al fine di eliminare "overflow di interi" come fonte di "imprevisto" (errori o eccezioni) nella programmazione.

Tuttavia, per C, due mentalità funzionano contro la seconda e la terza scelta:

  • Il linguaggio C cerca di mantenere la lingua stessa al minimo.
  • Anche il linguaggio C cerca di mantenere la libreria standard al minimo.

Quindi, il comitato che controlla C rifiuta di rettificare (standardizzare) una libreria bignum per il linguaggio di programmazione C. Gli utenti di C devono quindi cercare una libreria bignum, oppure implementarne una propria.

Il linguaggio C lascia fuori molte cose. Ad esempio, la maggior parte dei linguaggi di programmazione ha un'implementazione del checksum "Deflate" (compressione / decompressione) o "MD5" nelle loro librerie standard. C non.

Perché esiste una distinzione tra "bignums a dimensione fissa" e "bignum di dimensioni dinamiche"?

Questo perché bignums a dimensione fissa (dove la dimensione è determinata dal programmatore e scritta nel codice sorgente) consente di determinare la dimensione della memoria in fase di compilazione. Il codice macchina compilato è sia più semplice che più veloce - richiede meno istruzioni per eseguire ogni operazione. I bignum di dimensioni dinamiche richiedono più istruzioni della macchina per ogni operazione.

    
risposta data 03.10.2018 - 09:29
fonte
1

Riguarda il controllo della crescita.

Salva questo 1 per me da qualche parte. Non mi importa dove. Basta salvarlo.

Quindi prendi un po 'di carta e scrivi 1. Ora torno indietro e dico. Ehi, trasforma 1 in 5. Quindi cancelli 1 e metti giù 5. Oh fallo 42. Aspetta che non hai spazio per 42. Bene, ora puoi lanciare un errore o salvarlo da qualche altra parte. Ma se lo salvate da qualche altra parte, dovete aggiornare tutto ciò che ricorda dove era prima.

Puoi fare tutto questo ora. Non puoi farlo con int. I primitivi non erano progettati per crescere senza limiti. Questo è ciò che fanno le collezioni.

Almeno in alcune lingue. Agli altri non importa come fare tutto questo per tutto rallenta e occupa più spazio.

    
risposta data 15.09.2018 - 23:24
fonte
0

Why is there a limit on data types?

È più economico e veloce avere gamme power-of-2, anche se non è così flessibile per una matematica arbitraria.

Fondamentalmente sono state realizzate migliaia di architetture di processori in hardware e software con tutti i tipi di dati digitati dal 1940,50,60. È come se tu e io e molti altri ogni anno avessimo provato qualcosa ei disegni preferiti fossero sopravvissuti fino all'anno successivo. Un numero intero con poche scelte di larghezza: tutto con una potenza di 2 da circa 8 a 256 ha costantemente trovato più aderenti e supporto rispetto alla matematica a lunghezza variabile o altre larghezze di bit. Tempi matematici a larghezza variabile e problemi di gestione della memoria.

Semplicemente non c'è abbastanza richiesta per il suggerimento di OP di impegnarsi a costruire tale hardware. È più flessibile, ma non veloce perché i tipi di larghezza fissa sono più facili da realizzare nell'hardware e soddisfano la maggior parte delle esigenze.

    
risposta data 03.10.2018 - 00:13
fonte

Leggi altre domande sui tag