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_ttipo:para
uint64_ttipo:También puede utilizar
PRIx64para 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
PRId32y así sucesivamente para imprimirint32_t, y /"%d"o similar para imprimirint.fuente
#define __STDC_FORMAT_MACROSincluirlo antesinttypes.h.PRId64es 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
%jmodificador de longitud también se puede utilizar con la familia de funciones printf para imprimir valores de tipoint64_tyuint64_t:Compilar este código
gcc -Wall -pedantic -std=c99no 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 quejse usa para indicar una conversión a unintmax_touintmax_t; en mi stdint.h, ambosint64_tyintmax_testá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
%jdaparece 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_tyintmax_tson del mismo tipo, y si no es así, el comportamiento no está definido.%jdpara imprimirint64_tlos valores si se les convierte explícitamente aintmax_tantes 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_tyintmax_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
%lldes 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 longes 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 longsi ese tipo no utilizara el complemento de dos.long long).//VC6.0 (386 y mejor)
Saludos.
fuente