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.