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:
  1. 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.
  2. Wenn einer der Operanden vom Typ long double ist, wird der andere nach long double konvertiert.
  3. Wenn einer der Operanden vom Typ double ist, wird der andere nach double konvertiert.
  4. Wenn einer der Operanden vom Typ float ist, wird der andere nach float konvertiert.
  5. Wenn einer der Operanden vom Typ unsigned long ist, wird der andere nach unsigned long konvertiert.
  6. Wenn einer der Operanden vom Typ long ist, wird der andere nach long konvertiert.
  7. Wenn einer der Operanden vom Typ unsigned ist, wird der andere nach unsigned konvertiert.
  8. 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