variable valor tipos pantalla imprimir entero datos como caracteres cadena c printf

valor - Impresión multiplataforma de enteros de 64 bits con printf



printf en c (4)

Como alternativa puedes usar código como este:

uint64_t currentTimeMs = ...; printf("currentTimeMs = 0x%08x%08x/n", (uint32_t)(currentTimeMs >> 32), (uint32_t)(currentTimeMs & 0xFFFFFFFF) );

O tal vez:

printf("currentTimeMs = %u%09u/n", (uint32_t)(currentTimeMs / 1000000000), (uint32_t)(currentTimeMs % 1000000000) );

En Windows, es "% I64d". En Linux y Solaris, es "% lld".
Si quiero escribir printfs multiplataforma que printfs valores long long : ¿cuál es la mejor manera de hacerlo?

long long ll; printf(???, ll);


Hay un par de enfoques.

Podría escribir su código en conformidad con C99, y luego suministrar hacks específicos del sistema cuando los compiladores le fallan. (Lamentablemente, eso es bastante común en C99).

#include <stdint.h> #include <inttypes.h> printf("My value is %10" PRId64 "/n", some_64_bit_expression);

Si uno de sus sistemas de destino ha descuidado la implementación de <inttypes.h> o de alguna otra manera se ha <inttypes.h> diabólicamente porque algunas de las funciones de tipo son opcionales, entonces solo necesita un #define específico del sistema para PRId64 (o lo que sea) en ese sistema

El otro enfoque es elegir algo que actualmente siempre se implementa como de 64 bits y es compatible con printf, y luego se convierte. No es perfecto pero a menudo lo hará:

printf("My value is %10lld/n", (long long)some_64_bit_expression);


MSVC es compatible con long long Studio y Visual Studio 2005 .

Puede verificar el valor de la macro _MSC_VER ( >= 1400 para 2005), o simplemente no es compatible con compiladores más antiguos.

No proporciona las macros C99, por lo que tendrá que convertirlas en long long lugar de usar PRId64 .

Esto no ayudará si está utilizando bibliotecas MSVC antiguas con un compilador que no sea MSVC (creo que mingw, al menos, proporciona su propia versión de printf que admite ll )


No, en linux y solaris, es solo incidentalmente que esto es para un tipo de 64 bits. C99 prescribe macros simples (pero feas) para hacer que estas cosas sean portátiles PRId64 . Como algunos compiladores de Windows no siguen el estándar, es posible que no tengas suerte, pero desafortunadamente.

Edición: en su ejemplo, está utilizando una cosa diferente a un entero de 64 bits, es decir, un long long . Esto podría ser 128 en algunas arquitecturas. Aquí C99 tiene typedef s que le garantizan el ancho mínimo o exacto del tipo (si están implementados en la plataforma). Estos tipos se encuentran con el encabezado inttypes.h , es decir, int64_t para un tipo de 64 bits de ancho fijo determinado en el complemento de dos. Tal vez o tal vez no su compilador de Windows tiene esto.