Verständnisproblem unsigned int



  • Hallo Leute,

    offenbar habe ich etwas absolut nicht verstanden.
    Kann mir da jemand auf die Sprünge helfen?

    Wenn ich der unten aufgeführten Funktion eine negative Zahl übergebe, erhalte ich das richtige Ergebnis, obwohl die Zahl in der zweiten Zeile doch unsigned int gecasted wird?!?! Wie kann das sein?

    void itob(int zahl) {
    	unsigned int uzahl = (unsigned int)zahl;
    	unsigned int i = sizeof(zahl)*8;
    	char binzahl[i];
    
    	/* ... */
    
    	while(i > 0) {
    		if(uzahl & 0x1) {
    			binzahl[--i] = '1';
    		}
    		else {
    			binzahl[--i] = '0';
    		}
    		uzahl >>= 1;
    
    	}
    }
    




  • Ja, kenn ich. Hilft mir aber irgendwie nicht weiter 😕



  • fragr schrieb:

    Wenn ich der unten aufgeführten Funktion eine negative Zahl übergebe, erhalte ich das richtige Ergebnis, obwohl die Zahl in der zweiten Zeile doch unsigned int gecasted wird?!?! Wie kann das sein?

    Warum sollte sich was ändern? Beim casten bleibt das binärmuster vollständig erhalten.



  • Wozu wird es dann überhaupt dort gecasted?
    Ich dachte unsigned fast keine negativen Zahlen?!



  • unsigned vs. signed läft auf Maschinenebene nur auf eine andere Interpretation des Bitmusters hinaus. 1111 1111 1111 1101 als 32 Bit unsigned int entspricht der Zahl 4294967293, das selbe Bitmuster als Zweierkomplement (signed int) interpretiert, entspricht der Zahl -3...

    Der Grund, wieso in unsigned int gecastet wird, ist, dass das Ergebnis eines Rechtsshift einer negativen Zahl implementation-defined ist und daher je nach Compiler und Plattform etwas anderes rauskommen könnte. Hintergrund: Es ist fraglich und je nach ISA etc. potentiell unterschiedlich, ob das Vorzeichenbit mitgeshiftet wird oder dupliziert wird etc. Bei unsigned int ist es dagegen klar...


Anmelden zum Antworten