Programmiersprache C/C++
Arithmetische Standardkonvertierungen
Wenn ein arithmetischen Ausdruck wie etwa a + b benutzt wird,
wobei a und b von verschiedenem arithmetischen Typ sind, konvertiert C
die Operanden, bevor der Ausdruck ausgewertet wird.
Diese Standardkonvertierungen schließen auch Vorzeichenerweiterungen von
"kurzen" zu "längeren" Typen ein, womit erreicht werden soll,
daß der echte Zahlenwert möglichst erhalten bleibt und daß die
Operatoren für eine geringere Zahl unterschiedlicher Typen geeignet sein
müssen.
Typspezifizierer Konvertiert nach Methode
----------------------------------------------------------------------------
char int Auffüllen mit 0 oder Vorzeichen
(abhänging von der Voreinstellung für char)
unsigned char int Oberes Byte mit 0 auffüllen (immer)
signed char int Vorzeichenerweiterung (immer)
short int Wert bleibt gleich; Vorzeichenerweiterung
unsigned short unsigned int Wert bleibt gleich; Auffüllen mit 0
enum int Wert bleibt gleich
----------------------------------------------------------------------------
C führt folgende Schritte aus, um die Operanden eines
arithmetischen Ausdrucks zu konvertieren:
-
Alle "kleinen" Ganzzahl-Typen werden gemäß obiger Tabelle
konvertiert.
Danach sind alle durch einen Operator verknüpften Werte entweder vom
Typ int (einschließlich der Modifizierer long und unsigned) oder sie
sind vom Typ double, float oder long double.
-
Wenn einer der Operanden vom Typ long double ist, wird der andere nach
long double konvertiert.
-
Wenn einer der Operanden vom Typ double ist, wird der andere nach double
konvertiert.
-
Wenn einer der Operanden vom Typ float ist, wird der andere nach float
konvertiert.
-
Wenn einer der Operanden vom Typ unsigned long ist, wird der andere
nach unsigned long konvertiert.
-
Wenn einer der Operanden vom Typ long ist, wird der andere nach long
konvertiert.
-
Wenn einer der Operanden vom Typ unsigned ist, wird der andere nach
unsigned konvertiert.
-
In allen anderen Fällen sind beide Operanden vom Typ int.
Das Ergebnis des Ausdrucks hat denselben Typ wie die beiden Operanden.
Wird ein signed-Objekt (z.B. eine Variable) einem ganzzahligen Objekt
zugewiesen, so erfolgt eine automatische Vorzeichenerweiterung.
Bei der Konvertierung nach int werden Objekte des Typs signed char immer
vorzeichenerweitert, bei Objekten des Typs unsigned char wird immer das
obere Byte auf Null gesetzt.
Bei der Konvertierung eines "längeren" Ganzzahl-Typs in einen
"kürzeren" werden die oberen Bits abgeschnitten und die unteren bleiben
unverändert.
Bei der Konvertierung eines "kürzeren" in einen "längeren"
Ganzzahltyp werden die oberen Bits entweder durch Vorzeichenerweiterung
(wenn der kürzere Typ signed ist) oder durch Nullbits (wenn der
kürzere Typ unsigned ist) gefüllt.
Probleme
Beispiel:
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "String";
double d1, d2;
d1 = -(strlen(str) + 1);
d2 = -(double)(strlen(str) + 1);
printf("%lf %lf\n", d1, d2);
return 0;
}
Ein Test auf dem PC liefert folgende Ergebnisse:
MSC 6.0 65529.000000 -7.000000
TC 2.0 65529.000000 -7.000000
BC++ 4.52 65529.000000 -7.000000
BC++ 4.52 for Win32 4294967289.000000 -7.000000
gcc unter DOS 4294967289.00000000000000 -7.00000000000000
Der fehlerhafte Wert für d1 resultiert aus der Negation eines
unsigned-Wertes (strlen liefert einen Wert vom Typ
size_t, dies entspricht meist dem Typ unsigned int).
Zurück zum Menü
Zurück zur vorigen Seite
Weiter zur nächsten Seite
P. Böhme, 03.03.1996