[解決済み] すべてのビットを真にするために-1を使用しても安全ですか?
質問
このパターンはC&C++でよく使われているのを見かけます。
unsigned int flags = -1; // all bits are true
これは、これを達成するための良いポータブルな方法ですか? それとも
0xffffffff
または
~0
の方が良いですか?
どのように解決するのですか?
表示されたとおりに実行するのが、最もわかりやすいのでおすすめです。初期化は
-1
とすると、動作する
常に
であり、実際の符号表現に依存しない。
~
は正しいオペランド型を持っていなければならないので、時には驚くべき振る舞いをします。正しいオペランド型でなければならないからです。
unsigned
型の最も高い値を得ることができます。
考えられる驚きの例として、このようなものを考えてみましょう。
unsigned long a = ~0u;
必ずしもすべてのビットが 1 のパターンを
a
. しかし、これはまずすべてのビットが 1 のパターンを
unsigned int
に割り当て、それを
a
. このとき
unsigned long
がより多くのビットを持つ場合、それらのすべてが1であるとは限らないということです。
そして、2 の補数でない表現では失敗する、これを考えてみましょう。
unsigned int a = ~0; // Should have done ~0u !
その理由は
~0
はすべてのビットを反転させなければならないからです。それを反転させると
-1
を得ますが(これは私たちが必要とする値です!)、しかし
ではなく
が得られます。
-1
は別の表現では 1の補数マシンでは0になる。したがって、1 の補数マシンでは、上記は初期化され
a
をゼロに初期化します。
理解していただきたいのは、これはすべて値についてだということです - ビットではありません。変数の初期化には
値
. もしイニシャライザーの中で、初期化に使われる変数のビットを変更すれば、そのビットに応じた値が生成されます。初期化するために必要な値は
a
を可能な限り高い値に初期化するために必要な値は、次のとおりです。
-1
または
UINT_MAX
. もうひとつは
a
- を使用する必要があります。
ULONG_MAX
に対して
unsigned long
. しかし、1つ目はその型に依存しないでしょうし、最も高い値を得るには良い方法です。
私たちは
ではない
を話しているのではありません。
-1
がすべてのビットを1つ持っているかどうかを話しているのではありません(常に持っているわけではありません)。そして、私たちは
ではない
であるかどうかを話しているのです。
~0
がすべてのビットを 1 にするかどうかを話しているのではありません (もちろん、1 にしています)。
しかし、私たちが話しているのは、初期化された
flags
変数がどうなるかということです。そしてそれに対して
だけ
-1
は、あらゆるタイプやマシンで動作します。
関連
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] 32ビット整数のセットビットの数を数えるには?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】1回の乗算でビットを抽出する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】構造体のベクター初期化について
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] C言語での符号→符号なし変換 - 常に安全か?