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).
Beide diese Grenzen beziehen sich auf C++, nicht C# –
Das ist C++, nicht C#, siehe die Brotkrumen auf dieser Seite: '... C++ Language> Reference Grundtypen> Numerische Grenzen' –
Siehe https://msdn.microsoft .com/de-us/library/5kzh1b5w.aspx und https://msdn.microsoft.com/en-us/library/ctetwysk.aspx für C# –