ho scritto il seguente codice C:C esadecimale costante tipo
#include <stdio.h>
int main() {
printf("%d\n", -1 >> 8);
return 0;
}
compilo questo codice con gcc 4.6.3 sul mio x86_64 utilizzando il flag -m32. Ottengo -1 stampato come mi aspetterei, lo spostamento avviene aritmeticamente usando la rappresentazione del complemento a due risultante in -1.
Ora se invece scrivo
printf("%d\n", 0xFFFFFFFF >> 8);
ottengo 16777215. avrei aspettato questa costante deve essere interpretato come un int (firmato) e quindi il passaggio di essere aritmetica che porterebbe a -1 nuovamente. Ho esaminato l'ultimo standard C e non riesco a capire perché questo sia il caso. Qualche idea?
È la differenza tra firmato (-1) e non firmato (0xFFFFFFFF) – SpacedMonkey
@SpacedMonkey Sto chiedendo perché 0xFFFFFFFF è senza firma – dschatz
@SpacedMonkey Btw, '-' non contribuisce a questa differenza. '-' è ancora un operatore unario e non fa firmare qualcosa. È '1' che è firmato (e quindi anche' -1' è firmato), mentre '0xFFFFFFFF' non è firmato. –