为什么整数类型int64_t不保留此合法值?

时间:2019-07-19 04:18:37

标签: c++ c++11 int int64 numeric-limits

我正在尝试为一些极端情况编写测试用例。对于类型int64_t的输入,将不会编译以下行:

int64_t a = -9223372036854775808LL;

错误/警告是:

error: integer constant is so large that it is unsigned [-Werror]

我认为电话号码超出范围,所以我尝试了:

std::cout << std::numeric_limits<int64_t>::min() << std::endl;

它输出完全相同的数字!!!因此常数在范围内。

如何解决此错误?

2 个答案:

答案 0 :(得分:17)

你可以写

int64_t a = -1 - 9223372036854775807LL;

问题在于-不是文字的一部分,而是一元减。因此,编译器首先看到9223372036854775808LL(超出带符号int64_t的范围),然后找到它的负数。

通过应用二进制减号,我们可以使用两个均在范围内的文字。

答案 1 :(得分:8)

Ben已经解释了原因,这是另外两种可能的解决方案。

尝试一下

int64_t a = INT64_MIN;

或这个

int64_t a = std::numeric_limits<int64_t>::min();