Tengo un entero sin signo pero cuando lo imprimo usando% d a veces hay un valor negativo allí?C Unsigned int que proporciona un valor negativo?
Respuesta
Esto debería funcionar:
unsigned int a;
printf("%u\n", a);
Explicación: En la mayoría de las arquitecturas, firmaron enteros se representan en two's complement. En este sistema, los números positivos inferiores a 2**(N-1)
(donde N = sizeof(int)
) están representados de la misma manera, independientemente de si está utilizando un int
o un unsigned int
. Sin embargo, si el número en su int no firmado es mayor que 2**(N-1)
, representa un número con signo negativo en complemento a dos, que es lo que printf
le dio cuando lo pasó "%d"
.
La impresión %d
leerá el entero como un número decimal con signo, independientemente de su tipo definido.
Para imprimir números sin signo, use %u
.
Esto ocurre debido a la forma en que C maneja los argumentos variables. El compilador simplemente extrae los valores de la pila (mecanografiados como void*
y apuntando a la pila de llamadas) y printf
tiene que averiguar qué contienen los datos de la cadena de formato que le da.
Esta es la razón por lo que necesita para abastecer la cadena de formato - C no tiene forma de RTTI o una 'clase base' (Object
en Java, por ejemplo) para obtener un genérico o predefinido de toString
.
Nitpick: C es llamada por valor, por lo que el compilador extrae valores de argumento, no punteros. No pasa punteros a valores (printf ("% u", & myvariable);), pasa valores directamente (printf ("% u", myvariable);). – unwind
En realidad le da a 'printf' un puntero a la pila. – LiraNuna
@LiraNuna - La implementación de funciones varargs no está especificada, por lo que ni '#define va_copy (dest, src) dest = src' o' #define va_copy (dest, src) memcpy (dest, src, sizeof (va_list))) 'es un reemplazo portátil para la macro' va_copy' en los sistemas donde no se proporciona. Uno de ellos puede funcionar, pero ¿quién sabe cuál? –
% d significa que printf interpretará el valor como un int (que está firmado). use% u si es un int sin firmar.
- 1. C# unsigned int valor predeterminado
- 2. C++ uint, unsigned int, int
- 3. C - unsigned int a unsigned char array conversion
- 4. C size_t y ssize_t valor negativo
- 5. Compare int y unsigned int
- 6. C struct ++ que contiene unsigned char e int fallo
- 7. int dividido por unsigned int causando vuelco
- 8. Unsigned Int en Java
- 9. Desbordamiento de Unsigned Int
- 10. volatile unsigned int * const
- 11. lectura 'unsigned int' usando 'cin'
- 12. impresión unsigned long long int Tipo Valor Devuelve resultados extraños
- 13. Convierta un valor rgb int negativo en bruto a un valor rgb de 3 números
- 14. NSUEntero vs NSInteger, int vs unsigned, y casos similares
- 15. ¿Por qué este programa C genera un número negativo?
- 16. Diferencia entre uint y unsigned int?
- 17. sin signo de longitud con valor negativo
- 18. int Por qué no firmada contenía número negativo
- 19. ¿Cómo leer unsigned int en Javascript?
- 20. C++: advertencia del compilador para gran unsigned int
- 21. ¿Es int lo mismo que unsigned o signed?
- 22. C++ límite de unsigned int a través de la plantilla
- 23. cómo convertir ascii a unsigned int
- 24. JNI: conversión de unsigned int a jint
- 25. sql server 4 byte unsigned int
- 26. Unsigned Int en JPA e Hibernate
- 27. ¿Hay una función C# que formatea un valor "Unsigned" de 64 bits a su valor binario equivalente?
- 28. dirección de memoria valor positivo o negativo en c?
- 29. Omitir el tipo de datos (p. Ej. "Unsigned" en lugar de "unsigned int")
- 30. Tipo de datos MySQL INT (11) mientras que UNSIGNED INT (10)?
Vea si su compilador tiene una opción para advertir sobre este tipo de error. Es -formato con gcc. –
Posible duplicado de [¿Cómo puedo imprimir el valor máximo de un entero sin firmar?] (Http://stackoverflow.com/questions/12812812/how-can-i-print-maximum-value-of-an-unsigned-integer) –