雖然std::abs
(或::abs
爲Ç開發者)不提倡返回值,爲此不能處理std::numeric_limit<T>::min()
,我想有一個abs
實現,它確實更「安全」的處理。推動型ABS FPGA實現
template <typename T>
typename std::make_unsigned<typename std::enable_if<std::is_signed<T>::value, T>::type>::type secure_abs(T value) {
if(value >= 0)
return value;
if(value == std::numeric_limits<T>::min())
return *reinterpret_cast<typename std::make_unsigned<T>::type*>(&value);
return -value; //TODO: Prevent promotion to int
}
我還沒弄清楚的事情是如何防止升級到int(當刪除減號)後的轉換警告。
有沒有更優雅/正確的方法去除減號?
編輯:
現在應該是INT_MIN和2complement正確的。
需要注意的是,呼籲INT_MIN這個功能是不確定的行爲,和gcc的最新版本可即使利用這個事實來破壞你的代碼。您需要在應用運算符之前將其轉換爲無符號,或者計算1-(值+1)。 – 2013-02-24 19:23:18
「刪除減號」?我不明白。你爲什麼要刪除減號?整個功能就是「返回值」。那麼,不是嗎?你能詳細說明嗎? – 2013-02-24 19:45:42
@ JohannesSchaub-litb:他的意思是* *號碼 – 2013-02-24 20:04:28