我想在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