2016-06-03 19 views
7

In C,Qual è il tipo di dati predefinito di numero in C?

unsigned int size = 1024*1024*1024*2; 

che si traduce un avvertimento "integer overflow nella espressione ..." Mentre

unsigned int size = 2147483648; 

risultati nessun avvertimento?

Il valore corretto della prima espressione è predefinito come int? Dove menziona in C99 spec?

+1

Sei sicuro che il secondo valore non è ['2147483648'] (https://www.google.co.in/search?q=1024*1024*1024*2&rlz=1C1GIGM_enIN617IN617&oq=1024*1024*1024*2&aqs = chrome..69i57.1172j0j7 & sourceid = cromo & ie = UTF-8)? –

+0

Probabilmente intendevi il valore '2147483648'. La mia risposta lo assume. – 2501

+0

Era stato risolto! Grazie! – mingpepe

risposta

9

Quando si utilizza una costante decimale senza suffissi del tipo della costante decimale è il primo che può essere rappresentato, al fine (lo standard attuale C, 6.4.4 Costanti p5):

  • int
  • long int
  • long long int

il tipo della prima espressione è int, poiché ogni costante con il valore 1024 e 2 può essere rappresentato come int. Il calcolo di queste costanti sarà fatto in tipo int, e il risultato sarà overflow.

Supponendo che INT_MAX sia uguale a 2147483647 e LONG_MAX sia maggiore di 2147483647, il tipo della seconda espressione è long int, poiché questo valore non può essere rappresentato come int, ma può essere lungo int. Se INT_MAX è uguale a LONG_MAX uguale a 2147483647, il tipo è long long int.

+1

Salvo INT_MAX == LONG_MAX, nel qual caso la seconda espressione è probabilmente di tipo' long long int'. Si noti che Win64 è un ambiente a 64 bit dove INT_MAX == LONG_MAX; la maggior parte degli ambienti a 32 bit viene eseguita con INT_MAX == LONG_MAX. –

+0

@ JonathanLeffler Grazie. Sì, quelli sono limiti comuni, avrei dovuto ricordarmelo. – 2501

3
unsigned int size = 1024*1024*1024*2; 

Questa espressione 1024*1024*1024*2 (nell'espressione 1024 e 2 sono di tipo signed int) produce risultato che è di tipo signed int e questo valore è troppo grande per signed int. Pertanto, ricevi l'avviso.

Dopo tale moltiplicazione con segno viene assegnato a unsigned int.

+0

so che il valore è overflow per l'int firmato. Ma perché è firmato int? – mingpepe

+1

@mingpepe Poiché per impostazione predefinita '1024' e' 2' sono interi con segno, quindi il risultato della moltiplicazione è anche di tipo 'signed int' e quindi il tipo viene modificato quando viene assegnato a 'unsigned int'. – ameyCU

+0

Il prodotto '1024 * 1024 * 1024 * 2' overflow e' int' overflow è UB. Meglio usare '1024u * 1024 * 1024 * 2' – chux