Warum gibt es keine kurzint-Literale in 'C'?
Antworten
Zu viele Anzeigen?Alternativ: Weil sie nicht benötigt werden!
Die verschiedenen Datentypen werden in verschiedenen Größen benötigt, um gut zu der zugrunde liegenden Hardware zu passen und/oder um Speicherplatz zu sparen, aber Literale sind ein Kompilierzeit-Konstrukt, das sowieso in geeignete Datenstrukturen gespeichert wird.
Bei float
und double
ist es anders, weil die gleiche Zahl tatsächlich eine unterschiedliche interne Darstellung in diesen hat - mehr unterschiedlich, jedenfalls mehr als nur ein paar führende Nullen.
Ebenso gibt es einen Unterschied zwischen char
und short
, auch wenn sie möglicherweise in den gleichen Bits gespeichert werden: Wenn der Programmierer über Zeichendaten spricht, wird es für ihn normalerweise bequemer sein, beispielsweise 'A'
als 65
anzugeben.
Aber ein kurzes 99
und ein int 99
sehen für den Programmierer gleich aus, werden im Programm gleich behandelt... der weiterreichende Typ wird problemlos die Arbeit von beiden erledigen.
Wenn wir über das ursprüngliche Sprachdesign sprechen, denken Sie daran, dass C die meiste seiner aktuellen Form auf der PDP-11-CPU erhalten hat, die 16 Bit beträgt. Es gab also Ganzzahlen für die Arithmetik und Zeichen für die Zeichenspeicherung. Zeiger waren im Grunde genommen das gleiche wie Ganzzahlen.
Die Sprache war sehr pragmatisch und erhielt erst später eine formalere und komplexere Syntax. Also lautet die Antwort, es ist einfach so passiert. Viel später haben wir 32-Bit- und 64-Bit-CPUs erhalten und die Notwendigkeit, zwischen Ganzzahlen unterschiedlicher Längen zu unterscheiden.
Bis zum heutigen Tag programmiere ich fast alle meine C-Programme so, als gäbe es keinen anderen Typ als char und Ganzzahl. Ach übrigens, "char" in C kann sowohl vorzeichenbehaftet als auch vorzeichenlos sein nach dem Standard. Das spiegelt wider, dass Zeichen für die Zeichenspeicherung (Strings) und Ganzzahlen für die Arithmetik gedacht waren.
Zur Klarstellung (danke semaj): Der Compiler kann sich entscheiden, eine als "char" deklarierte Variable als "unsigned char" zu behandeln. Dies geschieht nicht bei einem "int". Ein "int" ist immer vorzeichenbehaftet, aber bei chars können Sie sich nicht sicher sein. Sie müssen davon ausgehen, dass ein char entweder vorzeichenbehaftete oder vorzeichenlose Arithmetik haben kann. Dies ist eine Geschwindigkeitsoptimierung, um CPUs zu berücksichtigen, die schneller mit einer der Implementierungen arbeiten. Der Fokus liegt also auf chars als Speichercontainer, nicht als Arithmetiktyp. (Auch der Name ist ein Hinweis. Es hätte "short" oder "small" genannt werden können, aber aus einem bestimmten Grund wurde es "char" genannt.)