如何在 C/C++ 中表示 -9223372036854775808?[复制]

How do I represent -9223372036854775808 in C/C++? [duplicate]

提问人:chacham15 提问时间:11/13/2023 最后编辑:chacham15 更新时间:11/14/2023 访问量:226

问:

这个问题在这里已经有答案了:
大负整数文字 (2 个答案)
9天前关闭。

社群在 9 天前审查了是否重新打开这个问题,并关闭了这个问题:

原始关闭原因未解决

-9223372036854775808 是最负面的int64_t。 问题是,如果我使用 or 然后我收到警告“整数文字太大,无法用有符号整数类型表示,解释为无符号”。问题是被分开处理,积极的9223372036854775808对int64_t来说确实太大了。如果我尝试,那么我会收到警告“一元减号运算符应用于无符号类型,结果仍未签名”。如何正确编码此数字?-9223372036854775808L-9223372036854775808LL--9223372036854775808UL

C++ C

评论

3赞 tkausl 11/13/2023
std::numeric_limits<int64_t>::min()
0赞 Some programmer dude 11/13/2023
Lfor 和 for .longLLlong long
3赞 alexisrdt 11/13/2023
只需在 C++ 中使用 ( 中定义)。INT64_MINstdint.hcstdint
2赞 Lundin 11/13/2023
认为 C 或 C++ 具有负整数常量是一个典型的错误。是应用于非负数的运算符 - 当像这样在源中写出时,它不是数字的一部分。-
2赞 Lundin 11/14/2023
@chacham15 不知道为什么 - 可能是出于历史原因,或者因为 C 支持各种异国情调的签名格式。我根据您的要求将链接添加到重复列表中。

答:

2赞 user16217248 11/13/2023 #1

尝试使用保证至少为 64 位的:LLlong long

-9223372036854775807LL-1

您可能还需要减去 1,以防万一不适合,因此不能存在以用一元否定。9223372036854775808long long-

4赞 Shrawns 11/13/2023 #2

您面临的问题是由于文本 -9223372036854775808 被视为正数,因为它超出了有符号 64 位整数的范围。若要在代码中正确表示此数字,可以使用 LL 后缀来指示长整数,也可以使用一元减运算符将其设为负数。下面是一个示例:

#include <stdint.h>
#include<iostream>
using namespace std;
int main() {
    int64_t myInt = -9223372036854775807LL - 1LL;
    cout<<myInt; // prints -9223372036854775808
    return 0;
}

通过从 -9223372036854775807LL 中减去 1,您可以有效地获得最小可表示值 int64_t。使用 LL 可确保将文本视为长整数。这种方法避免了解释为无符号类型或超出有符号整数范围的问题。

评论

1赞 chacham15 11/13/2023
这确实有效,但是没有办法将最小数字实际表示为硬编码的 int64?
0赞 Weijun Zhou 11/13/2023
在 C++ 的语法中,是一元运算符和文字的组合。即使对于简单的情况 ,它也不是语言中的文字,而是 和 文字的组合。OP问题中的理解是正确的。-9223372036854775807LL-9223372036854775807LL-1-1
0赞 Frodyne 11/13/2023
我刚刚检查了我的机器上的实现:.所以和这个答案基本一样。std::numeric_limits<int64_t>::min()return -__LONG_MAX__ - 1;
2赞 Lundin 11/13/2023
@chacham15 您应该使用 /。此外,您可以对宏进行一些逆向工程:godbolt.org/z/c9rYEa4d3。正如你所看到的,宏被定义为在这个特定的目标(gcc 64位Linux)上。INT64_MIN... ::min()(-9223372036854775807L-1)