比较int64_t和uint64_t

时间:2015-04-19 19:56:29

标签: c++ comparison int64 uint64

有人知道为什么这段代码会产生这样的输出吗? -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。不是吗?

2 个答案:

答案 0 :(得分:3)

if (k >= i-j)

双方都转换为无符号,因此可能-1被解释为0xFFFFFFFFFFFFFFFF:

if (0xFFFFFFFFFFFFFFFF >= 0)

根据标准(强调我的):

  

表达式[expr]

     

否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则带有符号整数类型的操作数应转换为带有无符号的操作数的类型整数类型

答案 1 :(得分:2)

没有。它可能会将0xffffffffffffffff0进行比较。在进行比较之前,signed变量会升级为unsigned类型。查找算术转换&#39;在标准中有更多细节。