Warum wurden Short, Int und Long in C erfunden?


16

Ich habe Probleme Verständnis habe, was waren der genaue Zweck der von der Erstellung short, intund longDatentypen 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 shortkleiner als eine intsind.

In welchen Situationen sollten Sie dann beispielsweise ein unsigned intoder unsigned longanstelle 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?)


2
Check out<stdint.h>
BlackJack 20.10.11

1
@BlackJack: Haha ja, das habe ich tatsächlich - aber ich schätze, meine Frage ist, warum sind nicht all diese Typen stattdessen nativ definiert? Handelt es sich um ein "Nachhinein ist 20/20" Problem, oder gab es einen bestimmten Grund?
Mehrdad

2
C sollte sowohl portabel als auch nah an der zugrunde liegenden Hardware sein. Es gab Plattformen, auf denen das Byte nicht 8 Bit lang war - aber Sie konnten immer noch C verwenden. Kein fester Satz von Datentypen würde jemals ausreichen, keine Ganzzahl mit fester Größe könnte jemals portabel sein.
SK-logic

@Sk-logic: Nicht mal wenn sie sagten sizeof(short) == 2 * sizeof(char)oder ähnliches?
Mehrdad

1
Es gibt Plattformen, auf denen 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.
SK-logic

Antworten:


12

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.


11
das ist nicht ganz richtig, shorts müssen nicht kleiner als ints sein, sie können nicht größer als ints sein
jk.

Ich werde das korrigieren.
Weltingenieur

2
Ebenso können Longs nicht kleiner als Ints sein.
Donal Fellows

1
In der Tat glaube ich, dass es Maschinen gegeben hat, bei denen Short, Int und Long genau gleich waren.
jk.

6

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 intdas kleinste Ding ist, das Zahlen verschiedener Größen handhaben kann, und intdas 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.


4

/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.


2
Aber mit 64-Bit intist das wohl kaum eine gute Wahl, oder? Ich benutze size_t(oder sogar ptrdiff_t!) Sowieso fast immer , um Probleme mit dem Portierungscode zu vermeiden.
Mehrdad

@Merhdad - int verwendet, um die beste Wahl zu treffen, wurde definiert, dass es die 'Standardeinheit' der Hardware ist und normalerweise die Größe eines Zeigers. Verwenden Sie heutzutage size_t zur Sicherheit.
Martin Beckett

1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.