【问题标题】:C++ Programs return int type, so why does return -1 return 255? [duplicate]C++程序返回int类型,为什么return -1返回255? [复制]
【发布时间】:2015-10-16 01:34:37
【问题描述】:

请注意,我正在运行一台 linux 机器,尽管我认为在 windows(或其他)机器上的结果没有什么不同。

这是一个简单的问题 - C++ 程序通常返回 32 位 int。如果我return -1,然后从终端打印结果,结果就是255

这是为什么?我觉得链接这是我应该知道的,或者很多年前就应该注意到的——我以前从未真正使用过返回码,也从未想过。

测试 C++ 程序:

int main()
{
    return -1;
}

编译:

g++ main.cpp -o a.out

运行:

./a.out

检查结果:

echo $?

结果:

255

我本来希望看到 2^32 - 1。

为什么结果255 不是-1 甚至4294967295。 (2^32 - 1)

【问题讨论】:

标签: c++ c operating-system integer return-value


【解决方案1】:

返回值定义为 int,但退出代码的合法值只有 0-255。

你可以把它想象成操作系统在内部执行 (unsigned char)main()。

为每个评论请求添加了解释:

  • 仅解释低八位这一事实在 POSIX(请参阅exit 函数文档)。不同的操作系统可能有不同的看法
  • 就机器代码而言,重要的是要认识到您的 main 函数可能不是程序的真正入口点。程序的真正入口点由 C 库提供,负责设置环境并调用您的 main。它还负责接受返回值并调用exit(your_return_value)。但正如其他人所指出的,这是一个实现细节,而不是 C 标准的一部分(C 和 posix 之间存在差异,尽管它们重叠)。

【讨论】:

  • 这在操作系统方面是如何工作的? (或机器代码)它是否只是从堆栈顶部复制 8 位,我假设 C++ 程序在执行开始时推回 4 批 8 位?
  • 返回值为int。 C++ 和 C 标准没有说明返回值是如何返回的(但通常它在寄存器中)。只要操作系统在返回值和对main 的调用方面保持一致性[顺便说一句,这通常不是应用程序启动的地方,通常会在此之前发生一些事情,例如设置@987654327 @、stdoutcincout,以及许多其他需要“在程序启动之前”发生的事情。]
  • "但是退出代码的合法值只有 0-255" 合法的根据谁?
【解决方案2】:

因为(不是全部)操作系统使用整个返回值。在这种情况下,它被截断为低 8 位。由操作系统(以及其他相关组件,例如 shell)来“使用”和“保留”这个值,这就是所谓的“实现细节”,换句话说,C 和 C++ 标准没有说明什么返回值的有用性或意义是 [除了下面的段落] - 从 C 的角度来看,它是一个 int - C 程序可以在该值被忽略、截断、扩展或相乘的环境中启动到 432 为止,它仍然是有效的 C 或 C++ 环境。

C 标准规定值 0EXIT_SUCCESS(据我理解应该是零值)和值 EXIT_FAILURE(一些非零值)应该分别被视为成功和失败。但是,所有其他值都是“实现定义的”,因此在执行发生的操作系统/环境的规则下。

请注意,当 shell(或任何运行您的程序)时,它不会直接跳转到您的 main,而是首先执行一些其他功能来初始化您的 main 函数所需的内容。一旦main 返回/退出,通常也会有一些代码在您的程序之后执行。具体如何工作取决于几件事:

  • 谁编写了编译器和/或运行时库
  • 它是为什么操作系统设计的
  • 它是什么处理器架构
  • 可能是什么 shell/运行时/OS 功能启动了该进程

C 和 C++ 标准没有定义这些东西,因为这样做可能会影响可以/将要运行 C 和/或 C++ 应用程序的实际平台,而 C 和 C++ 的目标是“具有包容性” -换句话说,尽量不要限制语言支持的环境、处理器等。

【讨论】:

  • C 标准要求状态返回 0 或 EXIT_SUCCESS 应解释为指示成功终止,而 EXIT_FAILURE 指示不成功终止。任何其他值的解释都是实现定义的。
  • 好吧,我加了一段话。
猜你喜欢
  • 2020-06-05
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多