web-dev-qa-db-ja.com

unsigned long longの最大値をCで表示するにはどうすればよいですか?

私はここで何が間違っているのですか?

$ cat size.c
#include<stdio.h>
#include<math.h>

int main() {

printf ("sizeof unsigned int = %d bytes.\n", sizeof(unsigned int));
printf ("sizeof unsigned long long = %d bytes.\n", sizeof(unsigned long long));

printf ("max unsigned int = %d\n", (int)(pow(2, 32) - 1));
printf ("max unsigned long long = %lld\n", (unsigned long long)(pow(2, 64) - 1));

}
$ gcc size.c -o size
$ ./size
sizeof unsigned int = 4 bytes.
sizeof unsigned long long = 8 bytes.
max unsigned int = 2147483647
max unsigned long long = -1
$ 

私は期待している 18446744073709551615の代わりに出力として-1最後の行。


さて、私は2の間違った値を取得していたことを完全に見逃しました32 -1、2147483647ではなく4294967295である必要があります。

16
Lazer

使用する %lluではなく、%llddは符号付き整数用なので、printfは符号付きlong longとして表示します。

19
sepp2k

特定の値があると思い込まないでください。useULLONG_MAX

29
Jens Gustedt

編集:クリストフの提案に従って〜0を(タイプ)-1に変更しました。以下のコメントを参照してください。

次のようにして、符号なし型の最大値を取得できます。

_unsigned long long x = (unsigned long long) -1;
_

簡単ですよね? =)。次に、printf()に、指定された変数を符号付きの長い長い小数として解釈するように指示しています。代わりにこれを試してください:

_unsigned long long x = (unsigned long long) -1;
printf("%llu", x);
_

_%llu_は「longlongunsigned」を意味します。

3
slezica
unsigned long long ulTestMax = -1;
printf ("max unsigned long long = %llu\n", ulTestMax );

これはC++で機能し、ここでも機能するはずです。

2
Kiril Kirov

キリルキーロフポストplsに-1をした人は誰でもここを見てください:

-1を使用してすべてのビットをtrueに設定しても安全ですか? Dingo post

Kirilの投稿では、符号拡張に関してわずかな変更のみが必要です:

unsigned long long ulTestMax = -1LLu; 

-1はアンチパターンです。lmits.hが提供するソリューションを使いたくない場合は、それでうまくいきます。

1
cyber_raj