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変数を印刷するには、どの形式を使用すればよいですか?
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_t
(PRIxPTR
)を含むすべてのタイプの利用可能なマクロの cppreference.comに完全なリストがあります 。 SCNd64
のように、scanfには別々のマクロがあります。
PRIu16の典型的な定義は"hu"
なので、暗黙の文字列定数連結はコンパイル時に行われます。
コードを完全に移植可能にするには、PRId32
を印刷するにはint32_t
などを使用し、int
を印刷するには"%d"
または同様のものを使用する必要があります。
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/ /
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ページは特にj
はintmax_t
またはuintmax_t
への変換を示すために使われます;私のstdint.hでは、int64_t
とintmax_t
は全く同じ方法でtypedefされます、そしてuint64_t
)も同様です。これが他のシステムに完全に移植可能かどうかはわかりません。
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;
}
Windows環境では、
%I64d
linuxでは、
%lld