1. ホーム
  2. c++

[解決済み] (18446744073709551615 == -1) はなぜ真なのでしょうか?

2022-02-07 05:50:10

質問

をやっていた時 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の補数をサポートするものの、信頼できる結果を保証する仕様がないアーキテクチャ/言語を理解するのに役立つと思われます。