web-dev-qa-db-ja.com

警告:左シフト数> =タイプの幅

私はビットを扱うのが非常に新しいので、コンパイル時に次の警告に固執しています:

_ 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_は不正確ですか、または根本的な何かを誤解していますか?

51

longは64ビット型でもかまいませんが、1は依然としてintです。 Lサフィックスを使用して、1long intにする必要があります。

unsigned long x = 1UL << 32;

(また、符号付き整数の左シフトの問題を回避するために、unsigned接尾辞を使用してUにする必要があります。longが64ビット幅で32ビットシフトしますが、63ビットシフトすると問題になります)

74
James McNellis

unsigned longは、システムに応じて32ビットまたは64ビットです。 unsigned long longは常に64ビットです。次のようにしてください。

unsigned long long x = 1ULL << 32
15
tznza

値を最大ビットにシフトすることはできません

_int x;         // let int be 4 bytes so max bits : 32 
x <<= 32; 
_

したがって、これは警告を生成します

left shift count >= width of type (i.e type = int = 32 )

1
vipul bagga

unsigned long x = 1UL << 31;

エラーメッセージを表示しません。 32を指定する前は、0〜31に制限されているためtrueではないためです。

1
Muthuraman

受け入れられたソリューションは、[定数] ULL << 32には適していますが、既存の変数には適していません。 [変数] << 32。変数の完全なソリューションは次のとおりです:((unsigned long long)[variable] << 32)。余談:この警告に対する私の個人的な意見は、そもそもそれはまったく不要だということです。コンパイラは、受信データ型が何であるかを確認し、ヘッダーまたは定数値の定義からパラメーターの幅を認識します。 Appleは、この警告に関するよりもclangコンパイラをもう少しインテリジェントにすることができると信じています。

0
VectorVictor