El estándar C99 tiene tipos enteros con un tamaño de bytes como int64_t. Estoy usando el siguiente código:
#include <stdio.h>
#include <stdint.h>
int64_t my_int = 999999999999999999;
printf("This is my_int: %I64d\n", my_int);
y recibo esta advertencia de compilación:
warning: format ‘%I64d’ expects type ‘int’, but argument 2 has type ‘int64_t’
Lo intenté con:
printf("This is my_int: %lld\n", my_int); // long long decimal
Pero recibo la misma advertencia. Estoy usando este compilador:
~/dev/c$ cc -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5664~89/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5664)
¿Qué formato debo usar para imprimir la variable my_int sin tener una advertencia?
Respuestas:
Por
int64_t
tipo:para
uint64_t
tipo:También puede utilizar
PRIx64
para imprimir en hexadecimal.cppreference.com tiene una lista completa de macros disponibles para todos los tipos, incluido
intptr_t
(PRIxPTR
). Hay macros separadas para scanf, comoSCNd64
.Una definición típica de PRIu16 sería
"hu"
, por lo que la concatenación implícita de cadena constante ocurre en tiempo de compilación.Para que su código sea totalmente portátil, debe usarlo
PRId32
y así sucesivamente para imprimirint32_t
, y /"%d"
o similar para imprimirint
.fuente
#define __STDC_FORMAT_MACROS
incluirlo antesinttypes.h
.PRId64
es una macro que se traduce internamente en"lld"
. Entonces, es tan bueno como escribirprintf("%lld\n", t);
Ver descripción: qnx.com/developers/docs/6.5.0/…ld
. La portabilidad es la razón de la macro.La forma C99 es
O podrías lanzar!
Si está atascado con una implementación de C89 (especialmente Visual Studio), tal vez pueda usar un código abierto
<inttypes.h>
(y<stdint.h>
): http://code.google.com/p/msinttypes/fuente
#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)
Con C99, el
%j
modificador de longitud también se puede utilizar con la familia de funciones printf para imprimir valores de tipoint64_t
yuint64_t
:Compilar este código
gcc -Wall -pedantic -std=c99
no genera advertencias y el programa imprime el resultado esperado:Esto está de acuerdo con
printf(3)
mi sistema Linux (la página del manual dice específicamente quej
se usa para indicar una conversión a unintmax_t
ouintmax_t
; en mi stdint.h, ambosint64_t
yintmax_t
están tipificados exactamente de la misma manera, y de manera similar parauint64_t
). No estoy seguro de si esto es perfectamente portátil para otros sistemas.fuente
%jd
aparece unaintmax_t
, la invocación correcta seríaprintf("a=%jd (0x%jx)", (intmax_t) a, (intmax_t) a)
. No hay ninguna garantía de queint64_t
yintmax_t
son del mismo tipo, y si no es así, el comportamiento no está definido.%jd
para imprimirint64_t
los valores si se les convierte explícitamente aintmax_t
antes de pasarlos aprintf
:printf("a=%jd\n", (intmax_t)a)
. Esto evita la fealdad (en mi humilde opinión) de las<inttypes.h>
macros. Por supuesto, esto supone que los soportes de aplicación%jd
,int64_t
yintmax_t
, todos los cuales fueron añadidos por C99.Procedente del mundo incrustado, donde incluso uclibc no siempre está disponible, y codifica como
uint64_t myval = 0xdeadfacedeadbeef; printf("%llx", myval);
está imprimiendo basura o no funciona en absoluto: siempre uso un pequeño ayudante, que me permite volcar correctamente uint64_t hexadecimal:
fuente
En el entorno de Windows, use
en Linux, use
fuente
%lld
es el formato paralong long int
, que no es necesariamente el mismo queint64_t
.<stdint.h>
tiene una macro para el formato correcto paraint64_t
; ver la respuesta de ouah .long long
es de al menos 64 bits,printf("%lld", (long long)x);
debería funcionar, excepto quizás para -0x8000000000000000, que no podría ser representable comolong long
si ese tipo no utilizara el complemento de dos.long long
).//VC6.0 (386 y mejor)
Saludos.
fuente