Сравнение int64_t и uint64_t

Кто-нибудь знает, почему этот код производит такой вывод? -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 ~]$

Я знаю, что типы разные, и для сравнения нужны два одинаковых типа, но в конце концов, это сравнение -1 а также 0, Не так ли?

2 ответа

Решение
if (k >= i-j)

обе стороны преобразуются в без знака, поэтому, возможно, -1 интерпретируется как 0xFFFFFFFFFFFFFFFF:

if (0xFFFFFFFFFFFFFFFF >= 0)

По стандарту (акцент мой):

Выражения [expr]

В противном случае, если операнд с целочисленным типом без знака имеет ранг больше или равен рангу типа другого операнда, операнд с целочисленным типом со знаком должен быть преобразован в тип операнда с целочисленным типом без знака.

Нет, это, вероятно, сравнение 0xffffffffffffffff в 0, signed Переменная повышается до unsigned введите, прежде чем сравнение будет сделано. Посмотрите "арифметические преобразования" в стандарте для более подробной информации.

Другие вопросы по тегам