提问人:chacham15 提问时间:11/13/2023 最后编辑:chacham15 更新时间:11/14/2023 访问量:226
如何在 C/C++ 中表示 -9223372036854775808?[复制]
How do I represent -9223372036854775808 in C/C++? [duplicate]
问:
这个问题在这里已经有答案了:
大负整数文字 (2 个答案)
为什么最负的 int 值会导致有关不明确的函数重载的错误? (3 个答案)
“整数常量太大,以至于它是无符号的”编译器警告理由 (3 个答案)
9天前关闭。
社群在 9 天前审查了是否重新打开这个问题,并关闭了这个问题:
原始关闭原因未解决
-9223372036854775808 是最负面的int64_t。 问题是,如果我使用 or 然后我收到警告“整数文字太大,无法用有符号整数类型表示,解释为无符号”。问题是被分开处理,积极的9223372036854775808对int64_t来说确实太大了。如果我尝试,那么我会收到警告“一元减号运算符应用于无符号类型,结果仍未签名”。如何正确编码此数字?-9223372036854775808L
-9223372036854775808LL
-
-9223372036854775808UL
答:
2赞
user16217248
11/13/2023
#1
尝试使用保证至少为 64 位的:LL
long long
-9223372036854775807LL-1
您可能还需要减去 1,以防万一不适合,因此不能存在以用一元否定。9223372036854775808
long 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)
评论
std::numeric_limits<int64_t>::min()
L
for 和 for .long
LL
long long
INT64_MIN
stdint.h
cstdint
-