为什么在C++中返回值超过255会返回不同的数字?

6
例如...
#include <iostream>

using namespace std;

int main(){return 300;}

返回:

Process finished with exit code 44

??


3
只需要8个比特。 300&0xff == 44。 很确定这主要是Unix的东西。请参见waitpid手册中的WEXITSTATUS-状态被OR到其他一些值中。 - asveikau
你能解释一下为什么吗?并且有没有可能返回一个更大的数值? - leszakk
2
不存在超过255的返回码。操作系统会忽略第一个八位以外的所有位。 - user207421
1
也许值得指出的是,这仅适用于程序的返回代码。显然,非主函数可以返回任何它们喜欢的东西。通常,程序返回代码仅用于错误处理,因此255个值就足够了(您实际的输出通常应该进入stdout,以便可以将其管道传输)。 - Dave
2
处理进程返回码将取决于操作系统,并且C++标准基本上只是说实现定义了会发生什么。 - David Schwartz
1个回答

8
标准只知道两个标准化的返回值: EXIT_SUCCESS (或零) 和 EXIT_FAILURE:

3.6.1/5 main函数中的返回语句会使main函数结束(销毁任何自动存储期限的对象),并将返回值作为参数调用std::exit

18.5/8 (...) 最后,控制权返回给主机环境。如果状态是零或EXIT_SUCCESS,则返回一个实现定义的状态成功终止的形式。如果状态是EXIT_FAILURE,则返回一个实现定义的状态不成功终止的形式。否则,返回的状态是实现定义的

因此,并不保证任何其他整数都会按原样返回。
例如,在MS Windows上,GetExitCodeProcess()函数返回整数值,因此您将获得300。
POSIX兼容系统(如Linux)上,规则是“仅8位最低有效位(即status&0377)可供等待的父进程使用”。因此,对于300,它将是44。

实际上,在Unix下,退出码位于MSB中,因此为(status & 0xff00) >> 8。之所以只有8个位数是出于历史原因:在最初的Unix [开发于PDP-11]下,一个“int”是16位,因此wait中的“status”没有更大的错误代码空间。为了向后兼容,即使现在大多数体系结构都将“int”定义为32位实体,错误代码的大小也没有增加。正如提到的那样,由程序返回的代码通过操作系统传递,并由父进程从syscall中获取,因此它取决于操作系统类型。 - Craig Estey
@CraigEstey 很有趣,谢谢!确实,我在《Unix操作系统设计》中找到了一条说明,解释了传递给 exit() 的低8位存储在内部进程返回代码的位8到15中,就像你说的那样。我想这就是为什么必须使用 WIFEXITED()WEXITSTATUS() 等正确解释从 wait() 获得的返回代码的原因...同样也适用于 system() 的返回值。 - Christophe
感谢 @HansPassant 的更新。事实上,Windows文档中有关 exit() 的说明是:“状态的低字节可用于主机环境”,但测试结果表明,总是返回完整的整数,就像您在使用 GetExitCodeProcess() 时所述一样。即使使用传统的 execlp() 也会发生这种情况。因此,似乎应将缺少单词“only”解释为“最低字节或更多” :-) - Christophe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接