Ich habe Probleme Verständnis habe, was waren der genaue Zweck der von der Erstellung short
, int
und long
Datentypen in C?
Der Grund, den ich frage, ist, dass es nicht so aussieht, als wären ihre Größen begrenzt - sie könnten von jeder Größe sein, solange sie zum Beispiel short
kleiner als eine int
sind.
In welchen Situationen sollten Sie dann beispielsweise ein unsigned int
oder unsigned long
anstelle eines verwenden size_t
, wenn dies keine Hoffnung auf Binärkompatibilität bietet?
(Wenn Sie die Größe nicht kennen, wie würden Sie dann wissen, wann Sie welche auswählen sollen?)
c
data-types
Mehrdad
quelle
quelle
<stdint.h>
sizeof(short) == 2 * sizeof(char)
oder ähnliches?sizeof(char) == sizeof(short)
es Sinn macht. Leider gibt es keine Möglichkeit, ganzzahlige Nummerntypen so anzugeben, dass sie für alle möglichen und vorhandenen Plattformen geeignet sind.Antworten:
Es würde durch die Architektur definiert, die Sie verwendeten. Auf einem Zilog z80-Chip (gebräuchlicher eingebetteter Chip) hätten sie eine Größe, während sie auf einem x86-Chipsatz eine völlig andere Größe haben könnten. Die Größen selbst sind jedoch feste Verhältnisse zueinander. Im Wesentlichen sind short und long keine Typen, qualifizieren sich jedoch für den int-Typ. Short-Ints sind eine Größenordnung kleiner als (Regular) Int und Long-Ints eine Größenordnung höher. Angenommen, Ihr Int ist auf 4 Bytes begrenzt, der kurze Qualifier begrenzt es auf 4 Bytes, obwohl 2 Bytes ebenfalls sehr häufig sind, und der lange Qualifier erhöht es möglicherweise auf 8 Bytes, obwohl es weniger als 4 Bytes betragen kann. Denken Sie daran, dass dies auch der Wortlänge unterliegt, sodass Sie auf einem 32-Bit-System die maximale Länge von 4 Bytes pro Int erreichen, wenn Sie die gleiche Länge wie bei einem regulären Int verwenden. Somit ist Short ≤ Int ≤ Long.
Wenn Sie es jedoch erneut verlängern, können Sie das int in die nächste Zelle verschieben, sodass Sie 8 Byte Speicherplatz haben. Dies ist die Wortgröße für 64-Bit-Maschinen, damit sie sich nicht um solche Dinge kümmern müssen und nur eine Zelle für Long-Ints verwenden, damit sie eine andere Größenordnung über den Standard-Ints haben, während Long-Ints wirklich Bit bekommen.
Was die Auswahl anbelangt, läuft es auf etwas hinaus, worüber sich Java-Programmierer beispielsweise keine Gedanken machen müssen. "Was ist deine Architektur?" Da alles von der Wortgröße des Speichers der betreffenden Maschine abhängt, müssen Sie dies im Voraus verstehen, bevor Sie sich für eine Verwendung entscheiden. Sie wählen dann die kleinste vernünftige Größe, um so viel Speicher wie möglich zu sparen, da dieser Speicher zugewiesen wird, unabhängig davon, ob Sie alle darin enthaltenen Bits verwenden oder nicht. Sie sparen also, wo Sie können, und wählen Shorts aus, wenn Sie können und Ints, wenn Sie nicht können und wenn Sie etwas benötigen, das größer ist als die regulären Ints, die Sie geben. Sie würden nach Bedarf verlängern, bis Sie die Wortgrenze erreicht haben. Dann müssten Sie eine große Anzahl von Routinen bereitstellen oder sie aus einer Bibliothek beziehen.
C ist zwar eine "tragbare Baugruppe", aber Sie müssen Ihre Hardware noch kennen.
quelle
Obwohl heute ein "Byte" "8 Bits" bedeutet, war dies nicht immer der Fall. Maschinen haben adressierbare Blöcke von 4 Bits, 8 Bits, 12 Bits, 16 Bits, 32 Bits und 36 Bits (und wahrscheinlich auch einige andere Größen) verwendet. Eine der Entwurfsabsichten von C war, auf Maschinen mit unterschiedlichen Speichergrößen und Konfigurationen verwendbar zu sein.
Ich denke, die Designabsicht war ursprünglich, dass jeder Typ anders als
int
das kleinste Ding ist, das Zahlen verschiedener Größen handhaben kann, undint
das die praktischste "Allzweck" -Größe ist, die +/- 32767 handhaben kann. Ich glaube nicht, dass es einen Wunsch oder eine Absicht gab, eine Sprache zu erstellen, die noch in Gebrauch war, als Computer so leistungsfähig wurden, dass Operationen mit 64-Bit-Zahlen genauso viel kosten wie Operationen mit kleineren.Das größte Problem bei der ganzzahligen Semantik von C besteht darin, dass sie in einigen Kontexten Kardinalzahlen oder mathematische Ganzzahlen darstellen, während sie in anderen Kontexten Mitglieder eines umhüllenden abstrakten algebraischen Rings von Ganzzahlen darstellen, die kongruent sind, mod 2 ^ n [also z. B. subtrahieren Der maximal darstellbare Wert von 0 wird definiert, um 1] zu ergeben, aber das Verhalten wird eher auf der Grundlage dessen angegeben, was Compiler an den Tagen zu tun schienen, als die Computerwortgrößen etwa 16 Bit betrugen (und eine Wortgröße von 36 Bit wäre riesig gewesen) ), anstatt auf der Grundlage dessen, was auf einer 64-Bit-Maschine sinnvoll wäre. Folglich kann das Ergebnis des Subtrahierens eines vorzeichenlosen 32-Bit-Werts von einem kleineren vorzeichenlosen 32-Bit-Wert entweder ein großer vorzeichenloser 32-Bit-Wert oder eine negative 64-Bit-Zahl sein.
quelle
/programming/589575/size-of-int-long-etc
In den am häufigsten verwendeten Architekturen beträgt char 1 Byte, short und int mindestens 2 Byte und long mindestens 4 Byte.
Und es ist beabsichtigt, dass 'int' die natürlichste / normalste / effizienteste Darstellung für die aktuelle CPU sein soll.
Daher lautet die allgemeine Regel "int", es sei denn, Ihre Werte überschreiten +/- 32 KB, sodass Sie (auf älteren CPUs) "long" verwenden. ... oder es sei denn, Sie erstellen große Arrays mit kleinen (<32 KB) Werten und der Arbeitsspeicher ist ein Problem. Verwenden Sie daher "short", um Arbeitsspeicher (oder möglicherweise "char" oder "byte") zu sparen.
quelle
int
ist das wohl kaum eine gute Wahl, oder? Ich benutzesize_t
(oder sogarptrdiff_t
!) Sowieso fast immer , um Probleme mit dem Portierungscode zu vermeiden.C wurde entwickelt, um aktiv mit dem Gedächtnis auf verschiedenen Ebenen umzugehen. Es gibt Fälle, in denen der Unterschied zwischen short, int und long sowie zwischen float und double aufgrund von Speicherbeschränkungen, Architektur usw. von Bedeutung ist Fälle, in denen die Daten sehr umfangreich sind), und der Übergang von hauptsächlich 32-Bit-Architekturen zu 64-Bit macht dies wieder zu einem Problem. (In zehn oder zwanzig Jahren, wenn wir auf 128-Bit-Architekturen umsteigen und C / C ++ immer noch beliebt ist, wird es wieder ein Problem sein.) Sie haben Recht, aber die Binärkompatibilität leidet, weshalb Sie diese variablen Schriftgrößen nicht verwenden möchten, wenn es darauf ankommt.
Sie haben gefragt, wie Sie wissen, was Sie verwenden sollen, wenn Sie die Größe nicht kennen, aber die Größe für eine bestimmte Architektur / Compiler-Kombination kennen. Wenn Sie den Speicher auf dieser Ebene optimieren müssen, sollten Sie dies besser wissen. Sie können es nicht einfach plattformübergreifend optimieren, da Sie deren Größe nicht kennen und diese Funktionen daher nicht für diesen Zweck verwenden möchten. Viele in C geschriebene Dinge sind jedoch plattformspezifisch, was trotz der Mode für "plattformübergreifend" einige vorteilhafte Optimierungen zulässt.
quelle