2016-06-03 4 views
7

In C,Was ist der Standarddatentyp der Zahl in C?

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

die eine Warnung "Integer-Überlauf in Ausdruck ..." -Ergebnisse Während

unsigned int size = 2147483648; 

Ergebnisse keine Warnung?

Ist der richtige Wert des ersten Ausdrucks standardmäßig int? Wo erwähnt es in C99 spec?

+1

Sind Sie sicher, dass der zweite Wert nicht ['2147483648'] ist (https://www.google.co.in/search?q=1024*1024*1024*2&rlz=1C1GIGM_enIN617IN617&oq=1024*1024*1024*2&aqs = chrome..69i57.1172j0j7 & sourceid = chrome & ie = UTF-8)? –

+0

Wahrscheinlich meinen Sie den Wert '2147483648'. Meine Antwort geht davon aus. – 2501

+0

Hatte repariert worden! Vielen Dank! – mingpepe

Antwort

9

Wenn eine dezimale Konstante verwendet, ohne die Art der Dezimalkonstante beliebiger Suffixe der ersten ist, dass, um die dargestellt werden kann (der aktuelle C-Standard, 6.4.4 Constants p5):

  • int
  • long int
  • long long int

der Typ des ersten Ausdrucks int, da jede konstante mit dem Wert 1024 und 2 kann als int dargestellt werden. Die Berechnung dieser Konstanten erfolgt im Typ int, und das Ergebnis wird überlaufen.

Angenommen INT_MAX ist gleich 2147483647 und LONG_MAX ist größer als 2147483647, der Typ des zweiten Ausdrucks ist long int, da dieser Wert nicht als int dargestellt werden kann, aber so lang int sein kann. Wenn INT_MAX gleich LONG_MAX gleich 2147483647 ist, ist der Typ long long int.

+1

Es sei denn, INT_MAX == LONG_MAX, in diesem Fall ist der zweite Ausdruck wahrscheinlich vom Typ 'long long int'. Beachten Sie, dass Win64 eine 64-Bit-Umgebung ist, in der INT_MAX == LONG_MAX; Die meisten 32-Bit-Umgebungen werden mit INT_MAX == LONG_MAX ausgeführt. –

+0

@ JonathanLeffler Danke. Ja, das sind gemeinsame Grenzen, daran hätte ich mich erinnern sollen. – 2501

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

Dieser Ausdruck 1024*1024*1024*2 (im Ausdruck 10242 und vom Typ sind signed int) erzeugt Ergebnis, das vom Typ signed int und dieser Wert ist zu groß für signed int. Daher erhalten Sie die Warnung.

Nach dieser Multiplikation mit Vorzeichen wird unsigned int zugewiesen.

+0

Ich weiß, dass der Wert Überlauf für vorzeichenbehaftete int ist. Aber warum ist es Int unterzeichnet? – mingpepe

+1

@mingpepe Da '1024' und' 2' standardmäßig ganze Zahlen sind, ist das Multiplikationsergebnis auch vom Typ 'signed int' und der Typ wird dann geändert, wenn er' unsigned int' zugewiesen wird. – ameyCU

+0

Das Produkt '1024 * 1024 * 1024 * 2' Überläufe und 'int' Überlauf ist UB. Besser zu verwenden: 1024u * 1024 * 1024 * 2' – chux