Сравнение 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
введите, прежде чем сравнение будет сделано. Посмотрите "арифметические преобразования" в стандарте для более подробной информации.