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 ~]$

我知道类型不同,比较需要两种相似的类型,但归根结底,它是比较-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 回答