Implizites bzw. Explizites Typecasting



  • #include <stdio.h>
    #include <conio.h>
    #include <limits.h>
    
    int main(void) {
    
      char c = 'A';
      int n = INT_MAX;
    
      printf("c = %d\n", c);
      printf("n = %d\n", n);
    
      c = (char) n;
    
      printf("c = %d\n", c);
    
     };
    

    Ergebnis:

    c = 65
    n = 2147483647
    
    c = -1
    

    Hallo,

    ich würde gerne wissen was bei der Ausführung intern bzw. was mit den Bits beim expliziten/ impliziten ( gleiches Ergebnis) Typecasting passiert.

    Mein Vermutung wäre, dass alle Bits vom Int Datentyp, die höher/größer als 2^0 nicht berücksichtig werden. Außerdem wird das letzte Bit des Int's (Bit 31) auf 1 gesetzt und das erste auch auf 1, da 2^0 = 1. Im Ganzen würde dann die -1 rauskommen, die auch im Ergebnis ist. Was steckt aber nun technisch bzw. algorithmisch dahinter?

    mfg. 3dprogger



  • Es werden da gar keine Bits gesetzt oder so. 2147483647 entspricht hexadezimal 0x7FFFFFFF. Wenn du diesen Wert als (char) castest, nimmt der Compiler die niederwertigsten 8 Bits, also 0xFF. Da bei diesem Wert das erste Bit 1 ist und du ihn als %d ausgeben lässt, wird er als vorzeichenbehaftetes (signed) Zweierkomplement angesehen. Und die dezimale Darstellung davon ist eben -1.



  • Danke Schön zuerst! An die hexadezimale Variante habe ich nicht gedacht, aber nun ist es einleuchtend.

    mfg. 3dprogger



  • In C ist es durchaus hilfreich, sich alles in Hex anzeigen zu lassen, weil auch der Prozessor/Controller in Hex denkt (eigentlich ja binär). Bestes Beispiel ist INT_MAX, sieht in Hex doch gleich viel einleuchtender aus...


Anmelden zum Antworten