Standar C99 memiliki tipe integer dengan ukuran byte seperti int64_t. Saya menggunakan kode berikut:
#include <stdio.h>
#include <stdint.h>
int64_t my_int = 999999999999999999;
printf("This is my_int: %I64d\n", my_int);
dan saya mendapatkan peringatan kompiler ini:
warning: format ‘%I64d’ expects type ‘int’, but argument 2 has type ‘int64_t’
Saya mencoba dengan:
printf("This is my_int: %lld\n", my_int); // long long decimal
Tapi saya mendapat peringatan yang sama. Saya menggunakan kompiler ini:
~/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)
Format mana yang harus saya gunakan untuk mencetak variabel my_int tanpa peringatan?
Jawaban:
Untuk
int64_t
jenis:untuk
uint64_t
tipe:Anda juga dapat menggunakan
PRIx64
untuk mencetak dalam heksadesimal.cppreference.com memiliki daftar lengkap makro yang tersedia untuk semua jenis termasuk
intptr_t
(PRIxPTR
). Ada makro terpisah untuk scanf, sepertiSCNd64
.Definisi tipikal PRIu16 adalah
"hu"
, jadi rangkaian string-konstan implisit terjadi pada waktu kompilasi.Agar kode Anda sepenuhnya portabel, Anda harus menggunakan
PRId32
dan sebagainya untuk mencetakint32_t
, dan"%d"
atau serupa untuk mencetakint
.sumber
#define __STDC_FORMAT_MACROS
memasukkan sebelumnyainttypes.h
.PRId64
adalah makro yang diterjemahkan secara internal ke"lld"
. Jadi, sama baiknya dengan menulis.printf("%lld\n", t);
Lihat deskripsi: qnx.com/developers/docs/6.5.0/…ld
. Portabilitas adalah alasan untuk makro.Cara C99 adalah
Atau Anda bisa melemparkan!
Jika Anda terjebak dengan implementasi C89 (terutama Visual Studio), Anda mungkin dapat menggunakan sumber terbuka
<inttypes.h>
(dan<stdint.h>
): http://code.google.com/p/msinttypes/sumber
#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)
Dengan C99
%j
pengubah panjang juga dapat digunakan dengan keluarga fungsi printf untuk mencetak nilai tipeint64_t
danuint64_t
:Mengkompilasi kode ini dengan
gcc -Wall -pedantic -std=c99
tidak menghasilkan peringatan, dan program mencetak hasil yang diharapkan:Ini sesuai dengan
printf(3)
pada sistem Linux saya (halaman manual secara khusus mengatakan yangj
digunakan untuk menunjukkan konversi keintmax_t
atauuintmax_t
; di stdint.h saya, keduanyaint64_t
danintmax_t
diketikkan dengan cara yang persis sama, dan sama untukuint64_t
). Saya tidak yakin apakah ini sangat portabel untuk sistem lain.sumber
%jd
prnts anintmax_t
, doa yang benar adalahprintf("a=%jd (0x%jx)", (intmax_t) a, (intmax_t) a)
. Tidak ada jaminan bahwaint64_t
danintmax_t
adalah tipe yang sama, dan jika tidak, perilaku tersebut tidak terdefinisi.%jd
untuk mencetakint64_t
nilai jika Anda secara eksplisit mengkonversikannya keintmax_t
sebelum melewati mereka untukprintf
:printf("a=%jd\n", (intmax_t)a)
. Ini menghindari keburukan (IMHO) dari<inttypes.h>
makro. Tentu saja ini mengasumsikan bahwa dukungan implementasi%jd
,int64_t
danintmax_t
, semua yang ditambahkan oleh C99.Berasal dari dunia tertanam, di mana bahkan uclibc tidak selalu tersedia, dan kode suka
uint64_t myval = 0xdeadfacedeadbeef; printf("%llx", myval);
sedang mencetak Anda omong kosong atau tidak bekerja sama sekali - saya selalu menggunakan pembantu kecil, yang memungkinkan saya untuk membuang dengan benar uint64_t hex:
sumber
Di lingkungan windows, gunakan
di Linux, gunakan
sumber
%lld
adalah format untuklong long int
, yang belum tentu sama denganint64_t
.<stdint.h>
memiliki makro untuk format yang benar untukint64_t
; lihat jawaban ouah .long long
setidaknya 64-bit,printf("%lld", (long long)x);
harus bekerja, kecuali mungkin untuk -0x800000000000000000, yang tidak dapat dianggap sebagailong long
jika tipe itu tidak menggunakan komplemen dua.long long
).//VC6.0 (386 & lebih baik)
Salam.
sumber