[解決済み] (18446744073709551615 == -1) はなぜ真なのでしょうか?
質問
をやっていた時
string::npos
あることに気づいたのですが、それに対する説明はウェブ上では見つかりませんでした。
(string::npos == ULONG_MAX)
そして
(string::npos == -1)
が真であることを示します。
そこで、こんなことをやってみた。
(18446744073709551615 == -1)
というのも真である。
どうしてそんなことが可能なのでしょうか?バイナリ会話だからでしょうか?
どうすれば解決するの?
18,446,744,073,709,551,615
この番号に言及した。
18,446,744,073,709,551,615
は、実は
2^64 − 1
. ここで重要なのは
2^64-1
は基本的に0ベース
2^64
. 符号なし整数の1桁目は
0
ではなく
1
. そのため、最大値が
1
は、2つの可能な値があります。
0
または
1
(2).
を見てみましょう。
2^64 - 1
を64bitバイナリにすると、すべてのビットがONになります。
1111111111111111111111111111111111111111111111111111111111111111b
は
-1
を見てみましょう。
+1
を64bitバイナリで表示します。
0000000000000000000000000000000000000000000000000000000000000001b
でマイナスになるように 補数 (OCP)のビットを反転させます。
1111111111111111111111111111111111111111111111111111111111111110b
コンピュータはOCPを使うことはほとんどなく、OCPを使うのは 2の補数 (TCP)です。TCPを得るには、OCPに1を足すのです。
1111111111111111111111111111111111111111111111111111111111111110b (-1 in OCP)
+ 1b (1)
-----------------------------------------------------------------
1111111111111111111111111111111111111111111111111111111111111111b (-1 in TCP)
でも、ちょっと待ってください。
-1
は。
1111111111111111111111111111111111111111111111111111111111111111b
また、バイナリの場合
2^64 - 1
は
1111111111111111111111111111111111111111111111111111111111111111b
それなら、両者はイコールだ! そして、これがあなたが見ているものです。符号付き64ビット整数と符号なし64ビット整数を比較しているのです。C++では、符号ありの値を符号なしに変換することを意味し、コンパイラはこれを行う。
更新情報
技術的な訂正のため
コメントでdavmacさんに感謝
からの変換は
-1
というのは
signed
から
unsigned
の型が同じサイズであることは、実際には言語で規定されていることであり、アーキテクチャの機能ではありません。とはいえ、上記の回答は、2の補数をサポートするものの、信頼できる結果を保証する仕様がないアーキテクチャ/言語を理解するのに役立つと思われます。
関連
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] と'is'のどちらかを使って文字列を比較すると、異なる結果になることがあるのはなぜですか?
-
[解決済み] Pythonのクラスで等価性(equality)をサポートするエレガントな方法
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
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で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】std::cin.getline( ) vs. std::cin