虽然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