2

次のような C コードを書いた古い記憶があります。

long value = 0;

古き良き Win16 の時代に、value半分だけ初期化されてしまいました。つまり、下位 16 ビットが0メモリ内のその場所にある任意のランダム ビットであり、上位 16 ビットがそうでした。そのため、私は次のように書く条件になりました。

long value = 0L;

これは、C99 および/または C++ の下で、この時代にまだ必要ですか? intILP32 がとが両方とも 32 ビットであることを指定していることは知っていますが、 s が 32 ビットでs が 64ビットのlongLP64 を使用しているとします。接尾辞は必要ですか、それとも最新の形式の C および C++ では、リテラルが割り当てられている変数の長さに暗黙的に拡張されますか?intlong

符号なしの値はどうですか? つまり、これは必要ですか?

unsigned long value = 0UL;
4

4 に答える 4

7

あなたが与えた例ではそれらは必要ありません。ただし、やや条件の厳しい状況では必要になる場合があります。たとえば、次の場合は異なる値が生成される場合があります。

sizeof(1)
sizeof(1L)
于 2009-06-10T14:34:29.650 に答える
3

いいえ、これはもう必要ありません。あなたが説明している動作は、デバッガーだけでなくプログラムでも表示される場合、バグです。

于 2009-06-10T14:34:32.270 に答える
1

32 ビット コンパイラを想定しているため、16 ビット コンパイラを使用したときのように L は必要ないかもしれませんが、LL が必要になる場合があります。たとえば、次のようになります。

long long ll;
ll = 1<<32;

gcc -std=c99 は、「左シフト カウント >= 型の幅」と警告します。代わりに、次のことが必要です。

ll = 1LL<<32;

C++11 および C99 の標準リファレンスについては、https://stackoverflow.com/a/8108658/782738も参照してください。

于 2012-12-05T21:33:40.257 に答える
1

ただし、この表記は wchar_t 文字列に必要です。

L"I am a wchar_t string."

long long 整数の場合も...

これは削除する必要があると思いますが、有用ではありません (型はサフィックスではなく名前で宣言されます) が、C++11 では引き続きサポートされています。

うーん。

于 2014-07-25T11:39:30.207 に答える