Der Schein trügt

Letzens habe ich ein interessantes Codefragment in einer Vorlesung gesehen:

unsigned char x;
 
x = ~0xFF;
 
if(x == ~0xFF) {
	// should go there
} else {
	// but is ending up here
}

Wir landen hier eigentlich unerwartet im else-Zweig, aber warum?

Dabei muss man wissen, dass 0xFF z.B. bei einem 16-Bit-µC im Regelfall auch in ein 16-Bit-Register geladen wird, wenn intern (im Prozessor) damit gearbeitet wird, z.B. bei einer Addition.

Bei der Zuweisung wird 0xFF im Prozessorregister zu 0x00FF expandiert. Durch die Negation (~) ändert sich der Registerinhalt in 0xFF00. Das ist alles noch kein Problem, da durch den unsigned char nur die unteren 8 Bit berücksichtigt werden und somit 0x00 in x abgelegt wird.

Beim Vergleich wird dann 0x00 im Prozessorregister zu 0x0000 und wird somit mit 0xFF00 (0xFF -> 0x00FF -> (~) -> 0xFF00) verglichen. Und dieser Vergleich ergibt dann FALSE, weshalb wir dann auch im else-Zweig enden.

Ordnergrößen ausgeben

Nach einer Neuinstallation meines Betriebssystems war ich in meinem alten home-Verzeichnis auf der Suche nach Datenmüll. Dabei wollte ich mir einfach die einzelnen Ordnergrößen mal ansehen, wo überhaupt Speicherplatz verbraucht wird. Da ich aber kein solches Feature im Dateimanager gefunden habe, musste ich mir anderweitig behelfen. Das ist dabei rausgekommen:

find . -maxdepth 1 -type d -print | sort | while read -d $'\n' dir; 
do 
 du -hs "$dir"; 
done;

Das Verzeichnis wird nach Ordnern durchsucht, wobei nur die erste Ebene verwendet wird. Nach dem Alphabet sortiert werden dann jeweils die Ordnergrößen ausgeben.

Update:

Unter "Anwendungen / Zubehör / Festplattenbelegung analysieren" kann man sich sein Homeverzeichnis nach Ordnergröße sortiert auch in einer interaktiven Grafik ansehen.