11

我正在尝试为一些极端情况编写一个测试用例。对于 type 的输入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;

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

我该如何解决这个错误?

4

2 回答 2

20

你可以写

int64_t a = -1 - 9223372036854775807LL;

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

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

于 2019-07-19T04:22:44.253 回答
9

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

尝试这个

int64_t a = INT64_MIN;

或这个

int64_t a = std::numeric_limits<int64_t>::min();
于 2019-07-19T04:29:20.463 回答