424
#include <stdio.h>
int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

出力:

My number is 8 bytes wide and its value is 285212672l. A normal number is 0.

この予期しない結果は、を印刷した結果だと思いunsigned long long intます。どうprintf()ですかunsigned long long int

4

13 に答える 13

549

ll(el-el)long-long修飾子をu(符号なし)変換で使用します。(Windows、GNUで動作します)。

printf("%llu", 285212672);
于 2008-08-05T21:02:35.237 に答える
109

%d--> のためにint

%u--> のためにunsigned int

%ld-->long intまたはlong

%lu-->unsigned long intまたはlong unsigned intまたはunsigned long

%lld-->long long intまたはlong long

%llu-->unsigned long long intまたはunsigned long long

于 2015-05-13T17:48:33.497 に答える
100

int32_t、などの型を提供するinttypes.hライブラリを使用してみてください 。その後int64_tuint64_t次のようなマクロを使用できます。

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

これは、各データ型のビット数を推測する必要がないためlong、などと同じ問題が発生しないように「保証」されています。unsigned long long

于 2008-08-12T11:07:50.060 に答える
40

MSVS を使用した long long (または __int64) には、%I64d を使用する必要があります。

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
于 2009-09-06T14:26:41.233 に答える
37

これは、%llu が Windows では正しく動作せず、%d が 64 ビット整数を処理できないためです。代わりに PRIu64 を使用することをお勧めします。Linux にも移植可能です。

代わりにこれを試してください:

#include <stdio.h>
#include <inttypes.h>

int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
    printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

出力

My number is 8 bytes wide and its value is 285212672. A normal number is 5.
于 2008-09-09T07:54:37.927 に答える
16

Linuxではそうで%llu、Windowsではそうです%I64u

Windows 2000 では動作しないことがわかりましたが、バグがあるようです。

于 2008-09-11T00:57:55.150 に答える
8

VS2005 で x64 としてコンパイルします。

%llu はうまくいきます。

于 2012-10-11T06:23:13.393 に答える
3

人々が何年も前に書いたことに加えて:

  • gcc/mingw で次のエラーが発生する場合があります。

main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]

printf("%llu\n", k);

次に、mingw のバージョンがデフォルトで c99 に設定されていません。次のコンパイラ フラグを追加します-std=c99

于 2016-01-17T12:27:29.953 に答える
1

非標準的なものは常に奇妙です:)

GNUの下での長い長い部分についてはLllまたはq

そして窓の下で私はそれがllただだと信じています

于 2008-08-05T21:03:07.810 に答える
0

1つの方法は、VS2008でx64としてコンパイルすることです。

これは期待どおりに実行されます。

int normalInt = 5; 
unsigned long long int num=285212672;
printf(
    "My number is %d bytes wide and its value is %ul. 
    A normal number is %d \n", 
    sizeof(num), 
    num, 
    normalInt);

32ビットコードの場合、正しい__int64形式指定子%I64uを使用する必要があります。だからなります。

int normalInt = 5; 
unsigned __int64 num=285212672;
printf(
    "My number is %d bytes wide and its value is %I64u. 
    A normal number is %d", 
    sizeof(num),
    num, normalInt);

このコードは、32ビットと64ビットの両方のVSコンパイラで機能します。

于 2008-08-05T21:40:24.757 に答える
0

16 進数:

printf("64bit: %llp", 0xffffffffffffffff);

出力:

64bit: FFFFFFFFFFFFFFFF
于 2015-07-26T09:57:06.023 に答える