Estaba esperando que esto imprima un número muy grande y ese mismo número -1 pero solo imprime -1 y -2, ¿por qué es esto?c ¿Por qué esto imprime un número negativo?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
Estaba esperando que esto imprima un número muy grande y ese mismo número -1 pero solo imprime -1 y -2, ¿por qué es esto?c ¿Por qué esto imprime un número negativo?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
El formato %d
es un entero con signo (decimal). Los enteros se almacenan usando two's complement, lo que significa que el bit de orden superior (8000 0000) indica, por así decirlo, el signo del valor.
una cuenta atrás de 3, los valores son:
0000 0003 = 3
0000 0002 = 2
0000 0001 = 1
0000 0000 = 0
FFFF FFFF = -1
FFFF FFFE = -2
etc.
Si desea FFFF FFFF para que aparezca como un número positivo grande, utilice el formato %u
(sin firmar).
Los valores que mencionas son la representación de complemento a dos de -1 y -2
Busque two's complement
El primer bit en un entero con signo es el signo, por lo que el número más alto que se puede almacenar es 0xEFFFFFFF.
El argumento "% d" imprime la entrada como un entero con signo. Como resultado, ha descubierto el two's complement representation, considere "% u" en su lugar.
oh, ¿cuál es el% por mucho tiempo? o sin firmar? – user105033
% u - simplemente agregado a la respuesta :) –
int es% d, unsigned es% u, long int es% ld, long unsigned es% lu –