¿Cómo imprimir "sin firma larga" en C?


342

Nunca puedo entender cómo imprimir el unsigned longtipo de datos en C.

Supongamos que unsigned_fooes un unsigned long, entonces intento:

  • printf("%lu\n", unsigned_foo)
  • printf("%du\n", unsigned_foo)
  • printf("%ud\n", unsigned_foo)
  • printf("%ll\n", unsigned_foo)
  • printf("%ld\n", unsigned_foo)
  • printf("%dl\n", unsigned_foo)

Y todos ellos imprimen algún tipo de -123123123número en lugar de lo unsigned longque tengo.

Respuestas:


499

%lues el formato correcto para unsigned long. Parece que hay otros problemas en juego aquí, como la corrupción de la memoria o una variable no inicializada. Quizás nos muestre una imagen más grande?


12
Vaya, %lufuncionó esta vez. Gracias. Algo más debe haber sucedido antes y no funcionó.
bodacydo

1
@bodacydo: Si tiene un error, puede aparecer de forma semialeatoria ... asegúrese de que su variable tenga un valor válido antes de intentar imprimirlo.
Thanatos

1
Incluso si la variable no está inicializada, no debería haber forma en que printf llegue a un punto en el que pueda imprimir un signo menos cuando el especificador de formato lo estaba %lu. Técnicamente es un comportamiento indefinido, pero en realidad la variable tiene un valor impredecible que se pasa a printf, que printf interpreta como no firmado. Supongo problema original de bodacydo era agua que llegue a una llamada printf incorrectos en lugar de la intención ...
R .. GitHub PARADA DE HIELO QUE AYUDA

8
@Anisha Kaul:% lu es una especificación de conversión válida,% ul no lo es. %lu, desglosado es: %- comienza una "especificación de conversión"; l- el modificador de longitud, lsignifica "[unsigned] long int"; u- el especificador de conversión, ues para unsigned intque se imprima como decimal. Debido a que le dimos el modificador de longitud l, entonces acepta un unsigned long int. Las letras deben estar en ese orden: porcentaje, longitud, conversión. (Hay algunas opciones más, como el ancho y la precisión, que puede agregar. ¡ Vea la página del manual , ya que documenta todo esto con precisión!)
Thanatos

1
% ul simplemente imprimirá sin firmar (con% u), y luego la letra "l" al pie de la letra. Así como "% uw" imprimirá sin firmar, seguido de la letra "w". % inicia el convspec, u (o algún otro carácter, como d, s, c ...) lo finaliza.
Veky

30
  • %lupor largo tiempo sin firmar
  • %llupara no firmado largo largo

13
Convención de Yoda: "unsigned long" "(l) ong (u) nsigned" es.
Reb.Cabin

28

Para int %d

Por mucho tiempo %ld

Por mucho tiempo int %lld

Para unsigned long long int %llu


23

De todas las combinaciones que probó, %ldy %luson las únicas que son especificadores de formato printf válidos. %lu(decimal largo sin signo) %lxo %lX(hexadecimal largo con letras minúsculas o mayúsculas) y %lo(octal largo) son los únicos especificadores de formato válidos para una variable de tipo sin signo largo (por supuesto, puede agregar modificadores de ancho de campo, precisión, etc. %y el l).


1
% ld funcionará bien hasta el valor de std :: numeric_limits <unsigned long> :: max () / 2. Por encima de ese% ld se imprimirá un valor incorrecto (valor negativo).
Kaushik Acharya

1
@KaushikAcharya: No, por encima de eso es UB. Y podría decirse que incluso UB antes de eso, ya que printfse especifica que requiere los tipos de argumentos correctos exactos sin las tolerancias que va_argtendrían.
R .. GitHub DEJA DE AYUDAR AL HIELO

9
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

Esto te será de ayuda. . .



8

El especificador correcto para largos sin signo es %lu.

Si no obtiene el valor exacto que espera, puede haber algunos problemas en su código.

Por favor copie su código aquí. Entonces, tal vez alguien pueda decirte mejor cuál es el problema.


-5

Yo tuve el mismo problema. Prueba "% ul", me funciona.


66
Esta pregunta fue ampliamente respondida hace más de 8 años. Por favor, asegúrese de que una nueva respuesta agrega nueva información y lo más importante es incluso correcto.
Gerhardh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.