¿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.

bodacydo
fuente

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?

Thanatos
fuente
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
NealCaffery
fuente
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

Linkon
fuente
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).

R .. GitHub DEJA DE AYUDAR AL HIELO
fuente
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. . .

Sanjith Bravo Dastan
fuente
9

El formato es %lu .

Por favor, consulte los otros tipos de datos y su uso en printf aquí

Praveen S
fuente
2
Varios comportamientos no estándar se documentan allí sin marcarlo como no estándar. POSIX es el estándar en línea más fácil de acceder para printf; las extensiones más allá de ISO C están marcadas con la etiqueta "CX": opengroup.org/onlinepubs/9699919799/functions/fprintf.html
R .. GitHub
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.

Kumar Alok
fuente
-5

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

Joseleo
fuente
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