为什么整数类型 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();
我正在尝试为一些特殊情况编写测试用例。对于 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();