我想在C++中编写一个函数,它使用两个64位无符号整数并返回它们在有符号64位整数中的差异。这似乎有点复杂,因为溢出情况 - 由于输入是两个无符号正整数,如果这两者之间的绝对差值大于最大有符号值(INT64_MAX),则差值不能通过有符号整数传输。所以我写了下面的实现,我想知道,首先,如果这在功能上是正确的,其次,是否有更简单的实现。任何建议将不胜感激。谢谢! (我会用一个异常来代替断言,它只是在那里吧!)C++:在一个有符号的64位整数中的两个无符号64位整数的差异
int64_t GetDifference(uint64_t first, uint64_t second) {
uint64_t abs_diff = (first > second) ? (first - second): (second - first);
uint64_t msb_abs_diff = (abs_diff >> (sizeof(abs_diff)*8 - 1)) & 1;
assert(msb_abs_diff == 0);
int64_t diff = first - second;
return diff;
}
好了,感谢所有的答案!我更担心功能的正确性,这是可以的,我猜...这些改进都是有效的,虽然没有根本的不同,但我会把它们合并。 – Abhi 2012-01-16 21:02:02
任何体面的编译器应该能够优化这样的代码,但请确保它是正确的。 – 2012-01-16 21:22:01