Pregunta

#include <stdio.h>
int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

Producción:

My number is 8 bytes wide and its value is 285212672l. A normal number is 0.

Supongo que este resultado inesperado se debe a la impresión del unsigned long long int.Cómo printf() un unsigned long long int?

¿Fue útil?

Solución

Utilice el modificador ll (el-el) long-long con la conversión u (sin signo).(Funciona en Windows, GNU).

printf("%llu", 285212672);

Otros consejos

Es posible que desee intentar utilizar la biblioteca inttypes.h que le proporciona tipos comoint32_t, int64_t, uint64_t etc.Luego puede utilizar sus macros como:

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

Esto está "garantizado" que no le causará los mismos problemas que long, unsigned long long etc, ya que no es necesario adivinar cuántos bits hay en cada tipo de datos.

%d--> para int

%u--> para unsigned int

%ld--> para long int

%lu--> para unsigned long int

%lld--> para long long int

%llu--> para unsigned long long int

Para long long (o __int64) usando MSVS, debes usar %I64d:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i

Esto se debe a que %llu no funciona correctamente en Windows y %d no puede manejar enteros de 64 bits.Sugiero usar PRIu64 en su lugar y encontrará que también es portátil para Linux.

Pruebe esto en su lugar:

#include <stdio.h>
#include <inttypes.h>

int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
    printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

Producción

My number is 8 bytes wide and its value is 285212672. A normal number is 5.

En Linux es %llu y en windows es %I64u

Aunque descubrí que no funciona en Windows 2000, ¡parece haber un error allí!

Compílelo como x64 con VS2005:

%lu funciona bien.

Las cosas no estándar siempre son extrañas :)

para la larga porción de larga duración bajo GNU es L, ll o q

y debajo de las ventanas creo que es ll solo

Maleficio:

printf("64bit: %llp", 0xffffffffffffffff);

Producción:

64bit: FFFFFFFFFFFFFFFF

Además de lo que la gente escribió hace años:

  • es posible que obtenga este error en gcc/mingw:

main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]

printf("%llu\n", k);

Entonces su versión de mingw no es c99 por defecto.Agregue esta bandera del compilador: -std=c99.

Bueno, una forma es compilarlo como x64 con VS2008.

Esto se ejecuta como era de esperar:

int normalInt = 5; 
unsigned long long int num=285212672;
printf(
    "My number is %d bytes wide and its value is %ul. 
    A normal number is %d \n", 
    sizeof(num), 
    num, 
    normalInt);

Para código de 32 bits, debemos utilizar el especificador de formato __int64 correcto %I64u.Así es.

int normalInt = 5; 
unsigned __int64 num=285212672;
printf(
    "My number is %d bytes wide and its value is %I64u. 
    A normal number is %d", 
    sizeof(num),
    num, normalInt);

Este código funciona para compiladores VS de 32 y 64 bits.

Al parecer, a nadie se le ha ocurrido una solución multiplataforma* para más de una década desde [el] año 2008, así que adjuntaré el mío 😛.Por favor vota a favor.(Bromas.No me importa.)

Solución: lltoa()

Cómo utilizar:

#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));

El ejemplo de OP:

#include <stdio.h>
#include <stdlib.h> /* lltoa() */

int main() {
    unsigned long long int num = 285212672; // fits in 29 bits
    char dummy[255];
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %s. "
        "A normal number is %d.\n", 
        sizeof(num), lltoa(num, dummy, 10), normalInt);
    return 0;
}

A diferencia del %lld cadena de formato de impresión, esta funciona para mí bajo GCC de 32 bits en Windows.

*) Bien, casi multiplataforma.En MSVC, aparentemente necesitas _ui64toa() en lugar de lltoa().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top