web-dev-qa-db-ja.com

Cでint64_t型を印刷する方法

C99規格にはint64_tのようなバイトサイズの整数型があります。私は次のコードを使っています。

#include <stdio.h>
#include <stdint.h>
int64_t my_int = 999999999999999999;
printf("This is my_int: %I64d\n", my_int);

そして私はこのコンパイラ警告を得る:

warning: format ‘%I64d’ expects type ‘int’, but argument 2 has type ‘int64_t’

私は試してみました:

printf("This is my_int: %lld\n", my_int); // long long decimal

しかし、私は同じ警告を受けます。私はこのコンパイラを使っています:

~/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)

警告を表示せずにmy_int変数を印刷するには、どの形式を使用すればよいですか?

253
rtacconi

int64_tの場合は、次のように入力します。

#include <inttypes.h>
int64_t t;
printf("%" PRId64 "\n", t);

uint64_tタイプの場合:

#include <inttypes.h>
uint64_t t;
printf("%" PRIu64 "\n", t);

PRIx64を使って16進数で印刷することもできます。

intptr_tPRIxPTR)を含むすべてのタイプの利用可能なマクロの cppreference.comに完全なリストがありますSCNd64のように、scanfには別々のマクロがあります。


PRIu16の典型的な定義は"hu"なので、暗黙の文字列定数連結はコンパイル時に行われます。

コードを完全に移植可能にするには、PRId32を印刷するにはint32_tなどを使用し、intを印刷するには"%d"または同様のものを使用する必要があります。

370
ouah

C99の方法は

#include <inttypes.h>
int64_t my_int = 999999999999999999;
printf("%" PRId64 "\n", my_int);

それとも、キャストすることができます!

printf("%ld", (long)my_int);
printf("%lld", (long long)my_int); /* C89 didn't define `long long` */
printf("%f", (double)my_int);

C89の実装(特にVisual Studio)で動けない場合は、おそらくオープンソースの<inttypes.h>(および<stdint.h>)を使用できます。 http://code.google.com/p/msinttypes/ /

55
pmg

C99では、%jの長さ修飾子をprintfファミリーの関数と一緒に使用して、タイプint64_tおよびuint64_tの値を印刷することもできます。

#include <stdio.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
    int64_t  a = 1LL << 63;
    uint64_t b = 1ULL << 63;

    printf("a=%jd (0x%jx)\n", a, a);
    printf("b=%ju (0x%jx)\n", b, b);

    return 0;
}

このコードをgcc -Wall -pedantic -std=c99でコンパイルしても警告は生成されず、プログラムは予想される出力を出力します。

a=-9223372036854775808 (0x8000000000000000)
b=9223372036854775808 (0x8000000000000000)

これは私のLinuxシステムのprintf(3)によるものです(manページは特にjintmax_tまたはuintmax_tへの変換を示すために使われます;私のstdint.hでは、int64_tintmax_tは全く同じ方法でtypedefされます、そしてuint64_t)も同様です。これが他のシステムに完全に移植可能かどうかはわかりません。

14
pjhsea

Uclibcさえ常に利用できるわけではない組み込み世界から来て、そしてコードのように

uint64_t myval = 0xdeadfacedeadbeef; printf("%llx", myval);

がらくたを印刷しているか、まったく機能していない - 私はいつも小さなヘルパーを使用しているので、uint64_t hexを正しくダンプできます。

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

char* ullx(uint64_t val)
{
    static char buf[34] = { [0 ... 33] = 0 };
    char* out = &buf[33];
    uint64_t hval = val;
    unsigned int hbase = 16;

    do {
        *out = "0123456789abcdef"[hval % hbase];
        --out;
        hval /= hbase;
    } while(hval);

    *out-- = 'x', *out = '0';

    return out;
}
6
ataraxic

Windows環境では、

%I64d

linuxでは、

%lld
6
benlong