Programmieren
 
 
 
 
 
C-Grundkurs
 
 
 
 
 
.. Besonderheiten beim Typ long
 
 

 
 
 
 
 
Zunächst sei angemerkt, dass es für den Typ long alternative Schreibweisen gibt, die das Schlüsselwort long als Modifizierer für int erscheinen lassen.
 
 
 
 
signed long
4
-2.147.483.648
+2.147.483.647
 
 
alternativ:
int long
 
 
 
 
 
 
long int
 
 
 
 
 
 
long signed int
 
 
 
 
 
 
unsigned long
4
0
+4.294.967.295
 
 
alternativ:
long unsigned
 
 
 
 
 
 
long unsigned int
 
 
 
 
 
 
Für große Ganzzahlen und als Speicher für Adressen(Zeiger). Die Kurzangabe 'long' steht für 'signed long'. Für 'unsigned long' gibt es keine Kurzform.
 
 
 
 
 
 
 
 
Für den Typ long werden vier Byte, also 32Bit benutzt. Daraus ergeben sich über die Formel: 2Anzahl der Bits = 2 32 die angegebenen Zahlenmengen, bei Beachtung des Umstandes, dass 0 auch eine Zahl ist, und zwar eine positive.

Problem
Nun besitzen CPUs nicht unbedingt Register mit 32 Bit, so dass arithmetische und logische Operationen bei Verwendung von long nicht in ihnen stattfinden können. Ebenso kann der Fall auftreten, dass Rechenoperationen mit Speicherzellen kleineren Byteumfangs als long, zu einem Überlauf dieser Speicher führen und deswegen im Typ long abgelegt werden sollen. Compiler können beide Problemfälle durch die Erzeugung eines entsprechenden Maschinencodes lösen. .. Nur man muss es ihnen sagen.

Beispiel:
Für eine Zeitangabe in Form von Stunden reicht ein Speicher mit einem Byte (char) Speicherumfang aus. Der Wert 23 wird nicht überschritten. Es ist sogar unerheblich, ob der verwendete char-Speicher vom Typ signed oder unsigned ist.
Soll nun diese Zeitangabe in Stunden zu einer in Sekunden umgerechnet werden, so ergibt sich als maximaler Wert 23 • 3600= 82800. Dieser Wert ist so groß, dass er weder in einen Speicher vom Typ char, noch einen solchen vom Typ unsigned int hineinpasst. Hier muss der Typ signed long bzw. unsigned long verwendet werden.
Die Formel für diese Umrechnung lautet:
                                                                        sekwert = stunde • 3600

Diese Berechnung erzeugt bei einer 16 Bit CPU einen Überlauf, wenn die Stunde einen Wert > 18 besitzt. Das Ergebnis wird falsch. Die C- Programmierung kann dem nur entgegenwirken, wenn bereits während der Berechnung der Typ des Ergebnis-Speicherraums bekannt ist.
Hierbei bringt es nichts, wenn erst gerechnet wird und dann das Ergebnis einem genügend großen Speicher zugewiesen wird, wie bei ..

.. falsch

  char stunde  = 23;
  long sekwert = 0;
  sekwert = (long) stunde * 3600      // falsches Ergebnis 17264

Das Ergebnis würde mit einem Wert von 17264 falsch sein, da ein Überlauf bei der Berechnung stunde • 3600 stattfand,. Auch die explizite Typwandlung, die hier entfallen könnte, bringt nichts, da bereits gerechnet wurde, bevor gewandelt wird.

.. richtig

Zur Lösung dieses Problems gibt es zwei Möglichkeiten. Entweder es wird dem genügend großen Speicher sekwert der Wert in stunde zugewiesen und dann mit sekwert weitergerechnet ..

  char stunde  = 23;
  long sekwert = stunde;
  sekwert = sekwert * 3600            // richtiges Ergebnis 82800

.. oder der Speicher stunde wird vor jeglicher Rechnung explizit in einen long-Speicher gewandelt, was durch den zweiten Satz Klammern angewiesen wird ..

  char stunde  = 23;
  long sekwert = 0;
  sekwert = ((long) stunde) * 3600    // richtiges Ergebnis 82800


Ausgabe des Ergebnisses mit printf()
Die Funktion printf() würde das Ergebnis in sekwert nur unvollständig ausgeben, wenn der Funktion nicht ausdrücklich erklärt würde, dass es sich bei der Ausgabeformatierung um den Wert eines long-Speichers handelt. Hierzu muss die Flagge l (kleines L) verwendet werden.

  printf("%d Stunden besitzen %ld Sekunden", stunde, sekwert);
 
 

 

 

 

www..de