uint64_t source = numeric_limits<uint64_t>::max();
int64_t target = source;
BOOST_CHECK(source != target);//THIS SHOULD CHECK AS true - target != source
此检查失败,但它应该传递 - 来源是目标不同。
uint64_t source = numeric_limits<uint64_t>::max();
int64_t target = source;
BOOST_CHECK(source != target);//THIS SHOULD CHECK AS true - target != source
此检查失败,但它应该传递 - 来源是目标不同。
是的,他们是不同的,但他们使用的比较时!=
, 通常的算术转换应用到他们。 这意味着这两个值被转换为相同的数据类型。
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)