Sto provando a fare un test per dire se il mio PC esegue il giusto spostamento aritmetico o logico spostando a destra il numero esadecimale FFFFFFFF
entro il 1
.Perché -1 >> 1 e 0xFFFFFFFF >> 1 producono risultati diversi?
So che un numero intero -1
si legge come FFFFFFFF
in esadecimale poiché è il complemento a due di 1
. Lo spostamento a destra di -1
entro il 1
produce FFFFFFFF
e mostra che il PC ha eseguito il giusto spostamento aritmetico.
Ma se si digita semplicemente 0xFFFFFFFF >> 1
, risulta 7FFFFFFF
e indica che il PC ha eseguito il giusto spostamento logico. Perché è successo? Vedere per il codice qui sotto che ha prodotto i risultati:
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char *argv[])
{
printf ("%x >> 1 = %x\n", -1, -1 >> 1);
printf ("%x >> 1 = %x\n", 0xffffffff, 0xffffffff >> 1);
return EXIT_SUCCESS;
}
uscita del programma è stata:
ffffffff >> 1 = ffffffff
ffffffff >> 1 = 7fffffff
'-1' è firmato. '0xffffffff' non è firmato. Non ha nulla a che fare con 'printf()'. – chux
I valori con segno negativo a spostamento a destra sono definiti dall'implementazione: '-1 >> 1' potrebbe stampare anche come' 7fffffff'. – chqrlie