2

このコードがそのような出力を生成する理由を誰かが知っていますか? -1 >= 0!!!

[mahmood@tiger ~]$ cat t.cpp
#include <iostream>
#include <stdint.h>
int main()
{
  uint64_t i = 10;
  uint64_t j = 10;
  int64_t k = -1;
  std::cout << "k=" << k << " i-j=" << i-j;
  if (k >= i-j)
    std::cout << " --> yes k>=i-j\n";
  return 0;
}
[mahmood@tiger ~]$ g++ t.cpp
[mahmood@tiger ~]$ ./a.out
k=-1 i-j=0 --> yes k>=i-j
[mahmood@tiger ~]$

タイプが異なり、比較には2つの同様のタイプが必要であることはわかっていますが、結局のところ、比較は-10です。ではない?

4

2 に答える 2

3
if (k >= i-j)

両側が符号なしに変換されるため、おそらく -1 は 0xFFFFFFFFFFFFFFFF として解釈されます。

if (0xFFFFFFFFFFFFFFFF >= 0)

標準によると(強調鉱山):

式 [expr]

それ以外の場合、符号なし整数型を持つオペランドのランクが他のオペランドの型のランク以上である場合、符号付き整数型を持つオペランドは、符号なし整数型を持つオペランドの型に変換されます。

于 2015-04-19T19:58:32.520 に答える
2

いいえ。 と比較0xffffffffffffffffしている可能性があり0ます。変数は、比較が行われる前に型にsigned昇格されます。unsigned詳細については、標準の「算術変換」を参照してください。

于 2015-04-19T19:58:44.587 に答える