C ++程序返回int类型,为什么返回-1返回255?

时间:2015-07-25 12:28:51

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

请注意,我正在运行一台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

2 个答案:

答案 0 :(得分:13)

因为(并非所有)操作系统都使用整个返回值。在这种情况下,它被截断为低8位。它取决于操作系统(和其他相关组件,如shell),以及#34;使用"并且"保留"这个值,以及它所谓的"实现细节",换句话说,C和C ++标准没有规定返回值的用处或含义是什么?从下面的段落开始] - 只是从C角度看它是int - C程序可以在一个环境中启动,在该环境中该值被忽略,截断,扩展或乘以432并且它仍然是一个有效的C或C ++环境。

C标准表示值0EXIT_SUCCESS(我应该理解值为零)和值EXIT_FAILURE(某些非零值)应该是分别考虑成功和失败。但是,所有其他值都是"实现定义"因此,在执行发生的OS /环境规则下。

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

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

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

答案 1 :(得分:6)

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

您可以将其视为操作系统在内部执行(unsigned char)main()。

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

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