私はビットを扱うのが非常に新しいので、コンパイル時に次の警告に固執しています:
_7: warning: left shift count >= width of type
_
私の7行目はこんな感じ
_unsigned long int x = 1 << 32;
_
私のシステムのlong
のサイズが32ビットの場合、これは理にかなっています。ただし、sizeof(long)
は_8
_を返し、_CHAR_BIT
_は_8
_として定義され、longが8x8 = 64ビット長であることを示唆します。
ここで何が欠けていますか? sizeof
と_CHAR_BIT
_は不正確ですか、または根本的な何かを誤解していますか?
long
は64ビット型でもかまいませんが、1
は依然としてint
です。 L
サフィックスを使用して、1
をlong int
にする必要があります。
unsigned long x = 1UL << 32;
(また、符号付き整数の左シフトの問題を回避するために、unsigned
接尾辞を使用してU
にする必要があります。long
が64ビット幅で32ビットシフトしますが、63ビットシフトすると問題になります)
unsigned long
は、システムに応じて32ビットまたは64ビットです。 unsigned long long
は常に64ビットです。次のようにしてください。
unsigned long long x = 1ULL << 32
値を最大ビットにシフトすることはできません
_int x; // let int be 4 bytes so max bits : 32
x <<= 32;
_
したがって、これは警告を生成します
left shift count >= width of type (i.e type = int = 32 )
unsigned long x = 1UL << 31;
エラーメッセージを表示しません。 32を指定する前は、0〜31に制限されているためtrueではないためです。
受け入れられたソリューションは、[定数] ULL << 32には適していますが、既存の変数には適していません。 [変数] << 32。変数の完全なソリューションは次のとおりです:((unsigned long long)[variable] << 32)。余談:この警告に対する私の個人的な意見は、そもそもそれはまったく不要だということです。コンパイラは、受信データ型が何であるかを確認し、ヘッダーまたは定数値の定義からパラメーターの幅を認識します。 Appleは、この警告に関するよりもclangコンパイラをもう少しインテリジェントにすることができると信じています。