为什么整数类型 int64_t 不能持有这个合法值?

Why can integer type int64_t not hold this legal value?

我正在尝试为一些特殊情况编写测试用例。对于 int64_t 类型的输入,以下行将无法编译:

int64_t a = -9223372036854775808LL;

error/warning是:

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

我以为这个数字超出了范围,所以我试了:

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

输出一模一样的数字!!!所以常数在范围内。

我该如何解决这个错误?

你可以写

int64_t a = -1 - 9223372036854775807LL;

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

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

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

试试这个

int64_t a = INT64_MIN;

或这个

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