¿Cuál es el especificador de conversión para printf que formatea un largo?

6 minutos de lectura

Avatar de usuario de Thomas Owens
Tomas Owens

los printf función toma un tipo de argumento, como %d o %i para signed int. Sin embargo, no veo nada para un long valor.

  • No lo use por mucho tiempo, no es portátil. stackoverflow.com/questions/16859500/mmh-quien-eres-priu64

    – Marcha

    23 de noviembre de 2019 a las 1:02

  • @MarcH – tampoco lo es int portátil. Históricamente, int era un valor de 16 bits; también ha sido un valor de 64 bits en algunas máquinas (Cray, por ejemplo). Incluso los ‘tipos de ancho exacto’ como int64_t no son 100% portátiles; se definen solo si la arquitectura admite dicho tipo. los int_least64_t Los tipos son lo más parecido a lo portátil.

    –Jonathan Leffler

    Hace 8 horas

  • La especificación C11 es §7.21.6.1 El fprintf función — la entrada en §7.21.6.3 El printf función en gran medida redirige a ¶7.21.6.1. La especificación POSIX es printf().

    –Jonathan Leffler

    Hace 8 horas


  • int tampoco es portátil pero puede ser la mejor opción en algunos casos; por ejemplo, el índice de un pequeño for loop normalmente no requiere portabilidad. Por otra parte,long no es portatil y nunca es útil y nunca es la mejor opción. long es simplemente malo Si necesita algo garantizado para ser de 32 bits o 64 bits, entonces use uint32_t o uint64_t. Simple. Si no están disponibles en alguna plataforma exótica, su código no compilará lo que desea.

    – Marcha

    hace 7 horas

avatar de usuario de posfuturista
posfuturista

Poner un l (letra L minúscula) directamente antes del especificador.

unsigned long n;
long m;

printf("%lu %ld", n, m);

  • printf("%ld", ULONG_MAX) genera el valor como -1. Debiera ser printf("%lu", ULONG_MAX) por tiempo sin firmar como se describe a continuación por @Blorgbeard.

    – Jammus

    12 de noviembre de 2011 a las 16:03

  • En realidad, deberías cambiarlo para que sea %ldpara ser más armónico con la pregunta OP.

    – DrBeco

    21 de junio de 2015 a las 5:28

  • Sí, Dr. Beco; más allá, solo %l disparadores warning: unknown conversion type character 0x20 in format [-Wformat]

    –Patricio Bertoni

    29 de julio de 2015 a las 10:53

Avatar de usuario de Blorgbeard
Barbarroja

Creo que quieres decir:

unsigned long n;
printf("%lu", n);   // unsigned long

o

long n;
printf("%ld", n);   // signed long

Avatar de usuario de Dave Dopson
david dopson

En la mayoría de las plataformas, long y int son del mismo tamaño (32 bits). Aún así, tiene su propio especificador de formato:

long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned

Para 64 bits, querrías un long long:

long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned

Ah, y por supuesto, es diferente en Windows:

printf("%l64d", n); // signed
printf("%l64u", un); // unsigned

Con frecuencia, cuando estoy imprimiendo valores de 64 bits, encuentro útil imprimirlos en hexadecimal (generalmente con números tan grandes, son punteros o campos de bits).

unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"

imprimirá:

0x00000000DEADBEEF

Por cierto, “largo” ya no significa tanto (en la corriente principal x64). “int” es el tamaño int predeterminado de la plataforma, normalmente 32 bits. “largo” suele ser del mismo tamaño. Sin embargo, tienen una semántica de portabilidad diferente en plataformas más antiguas (¡y plataformas integradas modernas!). “largo largo” es un número de 64 bits y, por lo general, lo que las personas querían usar a menos que realmente supieran lo que estaban haciendo al editar una pieza de código portátil de la plataforma x. Incluso entonces, probablemente habrían usado una macro para capturar el significado semántico del tipo (por ejemplo, uint64_t).

char c;       // 8 bits
short s;      // 16 bits
int i;        // 32 bits (on modern platforms)
long l;       // 32 bits
long long ll; // 64 bits 

En el pasado, “int” era de 16 bits. Uno pensaría que ahora sería de 64 bits, pero no, eso habría causado problemas de portabilidad increíbles. Por supuesto, incluso esto es una simplificación de la verdad arcana y rica en historia. Ver wiki:Entero

  • Solo para aclarar: hay más arquitecturas que x86 y x64, y en esas arquitecturas, char, short, int, long y long long tienen significados diferentes. Por ejemplo, un mcu de 32 bits con alineación de memoria de 16 bits podría usar: char=short=int=16 bit; largo=32 bits; largo largo = 64 bits

    – AndrésR

    6 sep 2016 a las 19:19


  • @AndresR: absolutamente, y es muy importante para las personas que realizan programación integrada (una vez construí un módulo kernel para una alarma de humo). Lástima de esas pobres almas cuando intentan usar un código que no fue escrito para la portabilidad.

    – Dave Dopson

    7 sep 2016 a las 19:44

  • No estoy tan seguro de que “la mayoría de las plataformas tengan un long eso es de tamaño 32″ sigue siendo cierto. Por ejemplo, estoy en Oracle Linux x86_64/amd64, y con nvcc a long es de 8 bytes.

    – parteinteresada333

    17 de junio de 2019 a las 18:02


  • “Ah, y por supuesto, es diferente en Windows”. ¿Existe una solución multiplataforma?

    – Aarón Franke

    13 de mayo de 2020 a las 9:05

  • @interestedparty333 Sí, estoy >95% seguro de que en Linux long tiene el mismo tamaño que la palabra/puntero (es decir, 32 bits en Linux de 32 bits y 64 bits en Linux de 64 bits). Si mira dentro del código del kernel de Linux o dentro de los controladores de Linux, generalmente almacenan punteros en long o unsigned long variables De hecho, hace unas semanas, un colega mío que portó un código de Windows a Linux tuvo que ir y cambiar todos nuestros longs a uint32_t porque los maltrataríamos constantemente al desarrollar bajo Windows.

    – AnthonyD973

    19 de febrero de 2021 a las 22:21


Depende, si se refiere a largo sin firmar, el carácter de formato es "%lu". Si te refieres a firmado largo, el carácter de formato es "%ld".

Avatar de usuario de Rob Walker
Rob Walker

%ld ver printf referencia en cplusplus.com

Avatar de usuario de Dolan Antenucci
Dolan Antenucci

En caso de que esté buscando imprimir unsigned long long como estaba, uso:

unsigned long long n;
printf("%llu", n);

Para todas las demás combinaciones, creo que usas la tabla de el manual de impresióntomando la fila, luego la etiqueta de la columna para cualquier tipo que esté tratando de imprimir (como hago con printf("%llu", n) arriba).

Avatar de usuario de Andrew O'Reilly
Andrew O´Reilly

Creo que para responder definitivamente a esta pregunta sería necesario conocer el nombre y la versión del compilador que está utilizando y la plataforma (tipo de CPU, sistema operativo, etc.) para la que se está compilando.

  • Su respuesta debe ser un comentario y no una respuesta en sí misma.

    – Jaime Hablutzel

    29 de agosto de 2019 a las 5:01

  • No: no hay dependencia de la plataforma en el formato correcto para imprimir un long – la respuesta correcta es %ld. El rango de valores que se pueden imprimir depende de la plataforma, en algunas plataformas long será de 32 bits (especialmente en 2008) y en otras plataformas será de 64 bits (especialmente en 2022 y posteriores). Pero si el tipo de datos es longlo correcto printf() el especificador de conversión es %ld (aunque puedes usar %li).

    –Jonathan Leffler

    Hace 8 horas

¿Ha sido útil esta solución?