Ошибка в BOOST_CHECK? - PullRequest
1 голос
/ 17 апреля 2011
uint64_t source = numeric_limits<uint64_t>::max();
int64_t target = source;
BOOST_CHECK(source != target);//THIS SHOULD CHECK AS true - target != source

Эта проверка не пройдена, но она должна пройти - источник отличается от цели.

1 Ответ

5 голосов
/ 17 апреля 2011

Да, они отличаются, но когда они сравниваются с использованием !=, к ним применяются обычные арифметические преобразования . Это означает, что оба значения преобразуются в один и тот же тип данных.

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).

...