valore massimo di numero intero


291

In C, l'intero (per la macchina a 32 bit) è 32 bit e varia da -32.768 a +32.767. In Java, anche il numero intero (lungo) è di 32 bit, ma varia da -2.147.483.648 a +2.147.483.647.

Non capisco come l'intervallo sia diverso in Java, anche se il numero di bit è lo stesso. Qualcuno può spiegare questo?


35
Per ottenere i valori massimo e minimo di int in Java, utilizzare Integer.MAX_VALUE e Integer.MIN_VALUE
live-love

5
@stackuser - Alcune buone risposte alla tua domanda - dovresti accettarne una :)
Darragh Enright,

2
@DarraghEnright è stato visto l'ultima volta a marzo 2015, dubito che tornerà :(
Ungeheuer,

4
@Adrian haha ​​- credo di no! Succede un po 'suppongo. Ho sempre immaginato che SO potesse facilmente accettare automaticamente le risposte in determinate condizioni - in cui la domanda ha superato una certa età, il PO è AWOL e c'è una risposta chiaramente utile con un alto numero di voti.
Darragh Enright,

2
@DarraghEnright Accetto. Ma OP era qui ~ 2 settimane fa, ha avuto la possibilità di accettare, quindi tecnicamente non è via.
Gaborsch,

Risposte:


392

In C , il linguaggio stesso non determina la rappresentazione di alcuni tipi di dati. Può variare da macchina a macchina, sui sistemi embedded intpuò essere larga 16 bit, sebbene di solito sia 32 bit.

L'unico requisito è che short int<= int<= long intper dimensione. Inoltre, esiste una raccomandazione che intdovrebbe rappresentare la capacità nativa del processore .

Tutti i tipi sono firmati. Il unsignedmodificatore consente di utilizzare il bit più alto come parte del valore (altrimenti è riservato al bit del segno).

Ecco una breve tabella dei possibili valori per i possibili tipi di dati:

          width                     minimum                         maximum
signed    8 bit                        -128                            +127
signed   16 bit                     -32 768                         +32 767
signed   32 bit              -2 147 483 648                  +2 147 483 647
signed   64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807
unsigned  8 bit                           0                            +255
unsigned 16 bit                           0                         +65 535
unsigned 32 bit                           0                  +4 294 967 295
unsigned 64 bit                           0     +18 446 744 073 709 551 615

In Java , la specifica del linguaggio Java determina la rappresentazione dei tipi di dati.

L'ordine è: byte8 bit, short16 bit, int32 bit, long64 bit. Tutti questi tipi sono firmati , non ci sono versioni non firmate. Tuttavia, le manipolazioni dei bit trattano i numeri come se fossero senza segno (ovvero gestendo correttamente tutti i bit).

Il tipo di dati carattere charè largo 16 bit, senza segno e contiene caratteri usando la codifica UTF-16 (tuttavia, è possibile assegnare un charnumero intero a 16 bit senza segno arbitrario che rappresenta un punto di codice carattere non valido)

          width                     minimum                         maximum

SIGNED
byte:     8 bit                        -128                            +127
short:   16 bit                     -32 768                         +32 767
int:     32 bit              -2 147 483 648                  +2 147 483 647
long:    64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807

UNSIGNED
char     16 bit                           0                         +65 535

10
Lo standard C specifica anche i valori minimi per INT_MAX, LONG_MAX, ecc.
Oliver Charlesworth,

13

4
Grazie, @jkbkot, bello saperlo. Anche se sembra che la rappresentazione sia ancora firmata, ma alcune operazioni non firmate sono implementate come una funzione. È difficile aggiungere due ints ...
gaborsch il

5
@GaborSch In Java, int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));stampe 2147483648e caratteri sono di tipo non firmato
howlger

2
@howlger Integer.MAX_VALUE + 1è 0x80000000in esadecimale, a causa dell'overflow (ed è uguale a Integer.MIN_VALUE). Se lo converti in unsigned (long), il bit di segno verrà trattato come un bit di valore, quindi lo sarà 2147483648. Grazie per la charnota charnon è firmato, hai ragione, ma il carattere non è realmente utilizzato per i calcoli, ecco perché l'ho lasciato dall'elenco.
gaborsch,

72

In C, il numero intero (per la macchina a 32 bit) è a 32 bit e varia da -32768 a +32767.

Sbagliato. L'intero con segno a 32 bit nella rappresentazione del complemento di 2 ha un intervallo compreso tra -2 31 e 2 31 -1 che è compreso tra -2.147.483.648 e 2.147.483.647.


3
Ho corretto la tua esponenziazione, **non è nemmeno C e non è molto chiaro secondo me. :)
Rilassati il

2
Ora sembra migliore, grazie! Troppo Python, suppongo. Evito ^dal momento che è di solitoxor
Kos,

5
Penso che il mio punto sia che dato che C non ha un operatore di esponenziazione, non penso che quel particolare pezzo debba essere formattato come codice. :)
Rilassati il

19

Un numero intero a 32 bit varia da -2.147.483.648 a 2.147.483.647. Tuttavia, il fatto che tu sia su una macchina a 32 bit non significa che il tuo Ccompilatore usi numeri interi a 32 bit.


1
Almeno la mia copia di Mr. Kernighan e Mr. Ritchies "Il linguaggio di programmazione C" dice in A4.2 che intè della "larghezza naturale della macchina" che interpreterei come 32 bit durante la compilazione per macchine a 32 bit.
Junix,

7
Questo dipende dal compilatore, non dalla macchina che credo. Per esempio, avevo un compilatore a 16 bit installato sul mio computer a 64 bit.
Ivaylo Strandjev,

Ovviamente il compilatore a 16 bit per il codice x86 a 16 bit ha utilizzato solo 16 bit. Ma non era quello il mio punto. Anche un processore x86 a 32 bit in esecuzione in modalità 16 bit ha solo una capacità nativa di soli 16 bit. Il mio punto è che la piattaforma di destinazione del compilatore conta. Ad esempio, se si dispone di un compilatore per il proprio 80286, si genererà comunque codice a 16 bit e quindi numeri interi a 16 bit.
Junix,

2
@junix Credo che sia esattamente ciò che faccio notare nella mia risposta. Non è il sistema operativo che specifica quanti bit hanno i tuoi numeri interi. La piattaforma di destinazione è una proprietà del compilatore, non del sistema operativo su cui sta lavorando o del processore in uso.
Ivaylo Strandjev,

Come ho scritto nel mio primo commento. "Sono 32 bit durante la compilazione per macchine a 32 bit". L'OP scrive nel suo post "l'intero (per la macchina a 32 bit)" Quindi, da quello che capisco, non si riferisce al suo sistema operativo, o alla sua macchina, si riferisce alla sua piattaforma di destinazione
131313

15

La definizione del linguaggio C specifica intervalli minimi per vari tipi di dati. Per intquesto intervallo minimo è compreso tra -32767 e 32767, il che significa che intdeve essere largo almeno 16 bit. Un'implementazione è gratuita per fornire un più ampioint tipo con una gamma corrispondentemente più ampia. Ad esempio, sul server di sviluppo SLES 10 su cui lavoro, l'intervallo è compreso tra -2147483647 e 2137483647.

Esistono ancora alcuni sistemi che usano inttipi a 16 bit (All The World Is Not A VAX x86), ma ce ne sono molti che usano inttipi a 32 bit e forse alcuni che usano 64 bit.

Il linguaggio C è stato progettato per funzionare su diverse architetture. Java è stato progettato per funzionare in una macchina virtuale che nasconde queste differenze architettoniche.


Per int a 16 bit, va da -3276 8 a 32767. Per int a 32 bit, va da -214748364 da 8 a 2147483647. L'intervallo è specificato da -2 ^ (n bit-1) a + 2 ^ (n bit-1 ) - 1.
miticalcoder

3
@Maven: 5.2.4.2.1 - INT_MINè specificato come -32767. Non dare per scontato il complemento a due.
John Bode,

8

Il rigoroso equivalente di Java intè long intin C.

Modifica: se int32_tdefinito, allora è l'equivalente in termini di precisione. long intgarantire la precisione del java int, poiché è garantito che abbia una dimensione di almeno 32 bit.


hai ragione, l'equivalente è int32_tse è definito dal tuo compilatore
UmNyobe,

7

Questo perché in C - numero intero su una macchina a 32 bit non significa che per la sua memorizzazione vengano utilizzati 32 bit, potrebbe anche essere di 16 bit. Dipende dalla macchina (dipendente dall'implementazione).


1
Bene, vale la pena notare che il tipico comportamento di implementazione sta usando "larghezza macchina" per int. Ma limits.haiuta a scoprire qual è la verità esatta
Junix,

3
Ma in realtà, non penso che un compilatore C per 32 sia mai stato realizzato senza int come 32 bit. Lo standard può consentire che l'implementazione del compilatore di int sia di natura idiota, ma per qualche motivo, nessuno vuole creare un compilatore C idiota. La tendenza è quella di creare utili compilatori C.
Lundin,


4

Effettivamente la dimensione in bit della int, short, long dipende dall'implementazione compilatore.

Ad esempio sul mio Ubuntu 64 bit ho shortin 32bit, quando su un'altra versione Ubuntu a 32 16bit è bit.


2

In realtà è davvero semplice da capire, puoi persino calcolarlo con il calcolatore di Google: hai 32 bit per un int e i computer sono binari, quindi puoi avere 2 valori per bit (spot). se calcoli 2 ^ 32 otterrai 4.294.967.296. quindi se dividi questo numero per 2 (perché metà di loro sono numeri interi negativi e l'altra metà sono positivi), ottieni 2.147.483.648. e questo numero è il più grande int che può essere rappresentato da 32 bit, anche se prestando attenzione noterai che 2.147.483.648 è maggiore di 2.147.483.647 di 1, questo perché uno dei numeri rappresenta 0 che è nel mezzo purtroppo 2 ^ 32 non è un numero dispari quindi non hai un solo numero nel mezzo, quindi gli interi possitivi hanno un numero in meno mentre i negativi ottengono la metà completa 2.147.483.648.

E questo è tutto. Dipende dalla macchina e non dalla lingua.


2
Non è quello che ha chiesto ... la domanda è "perché C int è diverso da Java int?"
Electron:

E in Java, la dimensione di int non dipende dalla macchina. int== 32 bit con segno, in complemento a due è definita dalla specifica del linguaggio Java, e incisi su fogli di anodizzato Unobtainium . (OK, forse non l'ultimo.)
Stephen C

1

Nell'intervallo C per __int32 è compreso tra –2147483648 e 2147483647. Vedere qui per gli intervalli completi.

unsigned short 0 to 65535
signed short 32768 to 32767
unsigned long 0 to 4294967295
signed long 2147483648 to 2147483647

Non ci sono garanzie che un 'int' sarà di 32 bit, se si desidera utilizzare variabili di una dimensione specifica, in particolare quando si scrive codice che comporta manipolazioni di bit, è necessario utilizzare i "Tipi di numeri interi standard".

In Java

Il tipo di dati int è un intero di complemento a due con segno a 32 bit. Ha un valore minimo di -2.147.483.648 e un valore massimo di 2.147.483.647 (incluso).


2
I valori indicati per C sono solo intervalli minimi.
Oliver Charlesworth,

@OliCharlesworth Range se dal minimo al massimo.
Achintya Jha,

6
Ciò che intendo è che l'intervallo per ciascun tipo può essere maggiore di quello che hai citato sopra.
Oliver Charlesworth,

3
Non c'è nulla in C chiamato __int32. Microsoft non ha un compilatore C strettamente conforme, quindi a chi importa come funziona il suo compilatore non C? L'unica fonte rilevante è ISO9899, ​​ovvero 5.2.4.2.1 "Dimensioni dei tipi di numeri interi" o 7.20.2.1 "Limiti dei tipi di numeri interi di larghezza esatta". Nessuno dei quali è compatibile con il goo di Microsoft.
Lundin,

2
C99 aggiunge int32_t, int16_t, ecc., Allo standard. Non compatibile al 100% con le aggiunte di Microsoft, ma funzionano in modo simile.
Chiedi a Monica il

-1

nello standard C, è possibile utilizzare INT_MAX come valore "int" massimo, questa costante deve essere definita in "limits.h". Costanti simili sono definite per altri tipi ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ), come indicato, queste costanti dipendono dall'implementazione ma hanno un valore minimo in base ai bit minimi per ogni tipo, come specificato nella norma.


5
Questo in realtà non risolve il problema affrontando la domanda del PO. Inoltre, le parti fondamentali di una risposta non dovrebbero essere sepolte su un altro sito.
Brad Koch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.