【发布时间】:2015-10-26 10:47:00
【问题描述】:
考虑符号(+1 或 -1)是已知的,并且有一个代码可以解析无符号整数。该无符号整数可以等于-numeric_limits<int64_t>::max()。如何在不触发未定义行为的情况下正确比较?
int8_t sign = /* +1 or -1 */;
uint64_t result = /* parse the remaining string as unsigned integer */;
if( result > uint64_t(numeric_limits<int64_t>::max()))
{
if(sign == 1) return false; // error: out of range for int64_t
// Is the below code correct or how to implement correctly its intent?
if(result == uint64_t(-numeric_limits<int64_t>::min()))
{
return true;
}
return false;
}
【问题讨论】:
-
这不应该是通常的情况吗:
abs(numeric_limits<int64_t>::min()) == numeric_limits<int64_t>::max()?那么第二个 if 永远不会评估为 true。 -
-numeric_limits<int64_t>::min()将在大多数实现中惨遭失败,因为它将转换为超出范围的内容(-128=>+128对于典型的int8,这是不可能的,所以你'可能会得到0)。 -
@m.s.在通常情况下(2 的补码)
abs(min) = max + 1。使用反码或符号大小时,abs(min) = max,没有问题,但这是“深奥”的情况。 -
@m.s.,这是我的担忧,但以下程序将
numeric_limits<int64_t>::min()的否定正确存储在uint64_t: ideone.com/uHIcCD 中。但这只是特定编译器的示例,而不是一般规则。 -
如果您假设二进制补码(对我来说看起来像?),那么您应该简单地从
result中删除一个并将其与max进行比较。
标签: c++ stl int64 uint64 numeric-limits