Да, они отличаются, но когда они сравниваются с использованием !=
, к ним применяются обычные арифметические преобразования . Это означает, что оба значения преобразуются в один и тот же тип данных.
ISO C99 (это для C, но C ++ очень похож) определяет в 6.3.1.8 Обычные арифметические преобразования:
[...] В противном случае, если операнд с целым типом без знака имеет ранг, больший или равный рангу типа другого операнда, тогда операнд с целым типом со знаком преобразуется в тип операнда с помощью целое число без знака.
uint64_t
и int64_t
имеют одинаковый ранг, поэтому оба значения преобразуются в uint64_t
, а выражение эквивалентно (uint64_t) source != (uint64_t) target
.
Чтобы получить желаемый результат, вы можете проверить source == target && (source < 0) == (target < 0)
.