uint64_t source = numeric_limits<uint64_t>::max();
int64_t target = source;
BOOST_CHECK(source != target);//THIS SHOULD CHECK AS true - target != source
此检查失败,但应该通过 - 来源与目标不同。
答案 0 :(得分:5)
是的,它们不同,但是当使用!=
进行比较时,通常的算术转换会应用于它们。这意味着两个值都将转换为相同的数据类型。
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)
。