Wie in kurz C # erklärt (aber auch für andere Sprachcompiler wie Java)
Es gibt eine vordefinierte implizite Konvertierung von kurz nach int, long, float, double oder decimal.
Sie können nichtliterale numerische Typen mit größerer Speichergröße nicht implizit in kurze konvertieren (die Speichergrößen für integrale Typen finden Sie in der Tabelle der integralen Typen). Betrachten Sie zum Beispiel die folgenden zwei kurzen Variablen x und y:
short x = 5, y = 12;
Die folgende Zuweisungsanweisung führt zu einem Kompilierungsfehler, da der arithmetische Ausdruck auf der rechten Seite des Zuweisungsoperators standardmäßig int ergibt.
short z = x + y;
Verwenden Sie eine Besetzung, um dieses Problem zu beheben:
short z = (short)(x + y);
Es ist jedoch möglich, die folgenden Anweisungen zu verwenden, wenn die Zielvariable dieselbe Speichergröße oder eine größere Speichergröße hat:
int m = x + y;
long n = x + y;
Eine gute Anschlussfrage lautet:
"Warum wird der arithmetische Ausdruck auf der rechten Seite des Zuweisungsoperators standardmäßig mit int ausgewertet?"
Eine erste Antwort finden Sie in:
Klassifizieren und formales Überprüfen der ganzzahligen konstanten Faltung
Die Java-Sprachspezifikation definiert genau, wie Ganzzahlnummern dargestellt werden und wie Ganzzahlarithmetikausdrücke ausgewertet werden sollen . Dies ist eine wichtige Eigenschaft von Java, da diese Programmiersprache für die Verwendung in verteilten Anwendungen im Internet entwickelt wurde. Ein Java-Programm ist erforderlich, um unabhängig von der Zielmaschine, die es ausführt, dasselbe Ergebnis zu erzielen .
Im Gegensatz dazu ist C (und die Mehrheit der weit verbreiteten imperativen und objektorientierten Programmiersprachen) schlampiger und lässt viele wichtige Merkmale offen. Die Absicht hinter dieser ungenauen Sprachspezifikation ist klar. Dieselben C-Programme sollen auf einer 16-Bit-, 32-Bit- oder sogar 64-Bit-Architektur ausgeführt werden, indem die ganzzahlige Arithmetik der Quellprogramme mit den im Zielprozessor integrierten arithmetischen Operationen instanziiert wird. Dies führt zu einem viel effizienteren Code, da die verfügbaren Maschinenoperationen direkt verwendet werden können. Solange die Ganzzahlberechnungen nur Zahlen behandeln, die "ausreichend klein" sind, treten keine Inkonsistenzen auf.
In diesem Sinne ist die C-Integer-Arithmetik ein Platzhalter, der nicht genau durch die Programmiersprachenspezifikation definiert ist, sondern nur durch Bestimmen der Zielmaschine vollständig instanziiert wird.
Java definiert genau, wie Ganzzahlen dargestellt werden und wie Ganzzahlarithmetik berechnet werden soll.
Java Integers
--------------------------
Signed | Unsigned
--------------------------
long (64-bit) |
int (32-bit) |
short (16-bit) | char (16-bit)
byte (8-bit) |
Char ist der einzige vorzeichenlose Integer-Typ. Seine Werte repräsentieren Unicode-Zeichen von \u0000
bis \uffff
, dh von 0 bis 2 16 −1.
Wenn ein Ganzzahloperator einen Operanden vom Typ long hat, wird der andere Operand ebenfalls in den Typ long konvertiert. Andernfalls wird die Operation für Operanden vom Typ int ausgeführt. Falls erforderlich, werden kürzere Operanden in int konvertiert . Die Konvertierungsregeln sind genau festgelegt.
[Aus elektronischen Notizen in der Theoretischen Informatik 82 Nr. 2 (2003)
Blesner-Blech-COCV 2003: Sabine GLESNER , Jan Olaf BLECH,
Fakultät für Informatik,
Universität Karlsruhe
Karlsruhe, Deutschland]
T a, b; a += b
entsprichtT a, b; a = (T) (a + b)
: Bekanntmachung der Compiler-added gegossen.