2010-07-09 14 views
255

Nunca puedo entender cómo imprimir unsigned long tipo de datos en C.Cómo imprimirf "unsigned long" en C?

Supongamos unsigned_foo es un unsigned long, entonces trato:

  • 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 imprimir algún tipo de -123123123 número en lugar de unsigned long que tengo.

Respuesta

375

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

+5

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

+0

@bodacydo: si tiene un error, puede aparecer en 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 de que printf llegue a un punto donde podría imprimir un signo menos cuando el especificador de formato era '% lu'. Técnicamente es un comportamiento indefinido, pero en realidad la variable tiene un valor impredecible que pasa a printf, que printf interpreta como unsigned. Supongo que el problema original de bodacydo fue el flujo de llegar a una llamada incorrecta de printf en lugar de la prevista ... –

8

El especificador correcto para long sin signo es %lu.

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

Copie su código aquí. Entonces, tal vez alguien pueda decirle mejor cuál es el problema.

20

De todas las combinaciones que ha intentado, %ld y %lu son los únicos que son especificadores de formato de impresión válidos. %lu (decimal sin signo largo), %lx o %lX (hex 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 largo sin signo (por supuesto puede agregar ancho de campo, precisión, etc modificadores entre el % y el l).

+1

% ld funcionará bien hasta el valor de std :: numeric_limits :: max()/2. Por encima de% ld se imprimirá el valor incorrecto (valor negativo). –

+1

@KaushikAcharya: No, arriba es UB. Y podría decirse que incluso UB antes de eso, ya que 'printf' se especifica para requerir los tipos de argumentos correctos exactos sin las tolerancias que' va_arg' tendría. –

8

El formato es %lu.

favor comprobar sobre los demás tipos de datos y su uso en printf here

+2

Varios comportamientos no estándar se documentan allí sin marcarlo como no estándar. POSIX es el estándar en línea de más fácil acceso para printf; las extensiones más allá de ISO C están marcadas con la etiqueta "CX": http://www.opengroup.org/onlinepubs/9699919799/functions/fprintf.html –

+0

¡Gracias amigo! Lo consideraré. –

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

Esto será útil. . .

14
  • %lu para unsigned long
  • %llu para unsigned long long
+5

Convención Yoda: "unsigned long" "(l) ong (u) nsigned" es. –

9

Para int%d

Para largo int%ld

Para largo long int%lld

Para unsigned long long int%llu

Cuestiones relacionadas