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...