2016-06-16 12 views
0

Jeder weiß das, int sind kleiner als long.int Limit vs lange Grenze

Hinter this MSDN link, lese ich folgendes:

INT_MIN (Minimum value for a variable of type int.) –2147483648 
INT_MAX (Maximum value for a variable of type int.)  2147483647 

LONG_MIN (Minimum value for a variable of type long.) –2147483648 
LONG_MAX (Maximum value for a variable of type long.) 2147483647 

Diese Informationen finden sich here finden.

Wurde mir mein ganzes Leben lang eine Lüge erzählt? Was ist der Unterschied zwischen int und long wenn nicht die Werte, die sie halten können? Woher?

+1

Beide diese Grenzen beziehen sich auf C++, nicht C# –

+0

Das ist C++, nicht C#, siehe die Brotkrumen auf dieser Seite: '... C++ Language> Reference Grundtypen> Numerische Grenzen' –

+0

Siehe https://msdn.microsoft .com/de-us/library/5kzh1b5w.aspx und https://msdn.microsoft.com/en-us/library/ctetwysk.aspx für C# –

Antwort

1

Sie erwähnt haben beide C++ und ASP.NET. Die beiden sind sehr unterschiedlich.

Was die C- und C++ - Spezifikationen betrifft, ist das Einzige, was Sie über einen primitiven Datentyp wissen, der maximale Wertebereich, den es speichern kann. Bereiten Sie sich auf Ihre erste Überraschung vor - int entspricht einer Bandbreite von [-32767; 32767]. Die meisten Leute denken heute, dass int eine 32-Bit-Nummer ist, aber es ist wirklich nur garantiert, in der Lage, das Äquivalent einer 16-Bit-Zahl, fast zu speichern. Beachten Sie auch, dass der Bereich nicht typischer ist [-32768; 32767], weil C als eine allgemeine abstrakte Maschine für eine breite Palette von Plattformen entworfen wurde, einschließlich Plattformen, die für ihre negativen Zahlen kein Zweierkomplement verwendeten.

Es sollte daher nicht überraschen, dass long eigentlich ein "32-Bit-Datentyp" ist. Dies bedeutet nicht, dass C++ - Implementierungen unter Linux (die normalerweise eine 64-Bit-Nummer für long verwenden) falsch sind, aber es bedeutet, dass für Linux geschriebene C++ - Anwendungen, die long 64-Bit sind, falsch sind. Das macht natürlich viel Spaß, wenn C++ - Anwendungen auf Windows portiert werden.

Der zu verwendende 64-Bit-Integer-Standardtyp lautet long long. Dies ist die Standardmethode zum Deklarieren einer 64-Bit-Ganzzahl unter Windows.

.NET interessiert sich jedoch nicht für solche Dinge, weil es von Grund auf auf seiner eigenen Spezifikation aufgebaut ist - teilweise genau wegen der Geschichte von C und C++. In .NET ist int eine 32-Bit-Ganzzahl und long ist eine 64-Bit-Ganzzahl und long ist immer größer als int. In C, wenn Sie long (32-bittish) verwendet und einen Wert wie 10 Billionen drin gespeichert, gab es eine Chance, es würde funktionieren, da es möglich ist, dass Ihre long eigentlich eine 64-Bit-Nummer war, und C war es egal über die Unterscheidung - genau das passiert bei den meisten Linux C und C++ Compilern. Da die Typen aus Performance-Gründen so definiert sind, ist es völlig legal, dass der Compiler einen 32-Bit-Datentyp verwendet, um einen 8-Bit-Wert zu speichern (beachten Sie das, wenn Sie "für Leistung optimieren" - der Compiler ist) eigene Optimierungen vornehmen). .NET kann immer noch auf Plattformen laufen, die z. 32-Bit-2-Komplement-Integer, aber die Laufzeit muss sicherstellen, dass der Typ so viel wie eine 32-Bit-Zweierkomplement-Ganzzahl enthalten kann, selbst wenn dies bedeutet, dass der nächstgrößere Typ verwendet wird (normalerweise doppelt soviel Speicher).

+0

auf 32-Bit-Linux 'lang' ist auch 32 Bits –

+0

@ LưuVĩnhPhúc Es hängt letztlich von der Compiler - Ich bin mir nicht sicher, welche Compiler es auf welche Art machen, aber der gesamte Linux-Code, mit dem ich gearbeitet habe, angenommen "long", kann einen 64-Bit-Wert enthalten (auf einem 64-Bit-Betriebssystem und einer CPU)). – Luaan

1

Dies ist C++

Auf vielen (aber nicht alle) C und C++ Implementierungen ist ein langer größer als ein int. Die heute beliebtesten Desktop-Plattformen, wie Windows und Linux, laufen hauptsächlich auf 32-Bit-Prozessoren und die meisten Compiler für diese Plattformen verwenden einen 32-Bit-Int, der die gleiche Größe und die gleiche Darstellung wie hat.

der Schiedsrichter Siehe http://tsemba.org/c/inttypes.html

1

in C und C++ sind die Anforderungen, dass int mindestens 16 Bits aufnehmen kann, kann long mindestens 32 Bit halten, und kann nicht als intlong größer sein. Es gibt keine Anforderung, dass int kleiner als long ist, obwohl Compiler sie oft so implementieren. Dir wurde keine Lüge erzählt, aber dir wurde eine zu starke Vereinfachung gesagt.

+0

Ja, es gibt eine dünne Linie zwischen "Lüge" und "Übervereinfachung". Kluge Menschen lügen durch die Vereinfachung: P – Luaan

1

Nein! Gut! Es ist so, wie uns seit der Kindheit gesagt wurde, dass die Sonne im Osten aufgeht und im Westen untergeht. (Die Sonne bewegt sich doch nicht!)
In früheren Verarbeitungsumgebungen, in denen wir 16-Bit-Betriebssysteme hatten, wurde eine ganze Zahl von 16 Bits (2 Bytes) und eine 'lange' als 4 Bytes angenommen (32 Bits)

aber mit dem Aufkommen von 32-Bit und 64-Bit-OS, eine ganze Zahl gesagt wird, aus 32 Bits bestehen (4 Bytes) und eine lange zu sein "atleast so groß als integer 'daher 32 Bits wieder. Dadurch kann die Gleichheit zwischen den maximalen und minimalen Bereichen 'int' und 'long' erklärt werden.

Daher hängt dies vollständig von der Architektur Ihres Systems.