65

私はビットの扱いに非常に慣れておらず、コンパイル時に次の警告に固執しています。

 7: warning: left shift count >= width of type

私の7行目は次のようになります

unsigned long int x = 1 << 32;

longこれは、私のシステムのサイズが32ビットの場合に意味があります。ただし、sizeof(long)returnsは8、longが8x8=64ビット長であることを示唆するものCHAR_BITとして定義されています。8

ここで何が欠けていますか?不正確ですかsizeofCHAR_BITそれとも私は何か根本的なことを誤解しましたか?

4

6 に答える 6

103

long64ビットタイプの場合もありますが、1それでもintです。接尾辞を使用して作成1する必要があります:long intL

unsigned long x = 1UL << 32;

(符号付き整数の左シフトの問題を回避するために、これまでに示しunsignedたサフィックスを使用する必要もあります。aが64ビット幅で、32ビットシフトする場合は問題ありませんが、次の場合は問題になります。 63ビットシフト)Ulong

于 2010-11-17T03:49:56.357 に答える
18

unsigned longシステムに応じて32ビットまたは64ビットです。unsigned long long常に64ビットです。次のように実行する必要があります。

unsigned long long x = 1ULL << 32
于 2012-08-11T01:15:26.650 に答える
2

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

于 2019-07-10T10:26:05.363 に答える
1

unsigned long x = 1UL << 31;

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

于 2010-11-18T10:22:44.453 に答える
1

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

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

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

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

于 2012-03-29T13:07:09.393 に答える
-2

次のようなものを使用できます。

unsigned long x = 1;
x = x << 32;
于 2014-03-10T09:14:33.907 に答える