Mi aspettavo che questo stampasse un numero molto grande e lo stesso numero -1 ma stampa solo -1 e -2, perché questo?c perché stampa un numero negativo?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
Mi aspettavo che questo stampasse un numero molto grande e lo stesso numero -1 ma stampa solo -1 e -2, perché questo?c perché stampa un numero negativo?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
Il formato %d
è un numero intero con segno (decimale). I numeri interi vengono memorizzati utilizzando two's complement, il che significa che il bit di ordine superiore (8000 0000) indica, per modo di dire, il segno del valore.
Conto alla rovescia da 3, i valori sono:
0000 0003 = 3
0000 0002 = 2
0000 0001 = 1
0000 0000 = 0
FFFF FFFF = -1
FFFF FFFE = -2
ecc
Se si desidera FFFF FFFF per visualizzare come un gran numero positivo, utilizzare il formato %u
(non firmato).
I valori di cui parli sono la rappresentazione in complemento a due di -1 e -2
Look up two's complement
Il primo bit su un intero con segno è il segno, in modo che il numero più alto che potrebbe essere memorizzata è 0xEFFFFFFF.
L'argomento "% d" stampa l'input come numero intero con segno. Di conseguenza, hai scoperto lo two's complement representation, considera invece "% u".
oh, qual è il% per lungo? o non firmato? – user105033
% u - appena aggiunto alla risposta :) –
int è% d, unsigned è% u, long int is% ld, long unsigned is% lu –