C++ 程序 return int 类型,为什么 return -1 return 255?
C++ Programs return int type, so why does return -1 return 255?
请注意,我是 运行 一台 linux 机器,尽管我认为 windows(或其他)机器上的结果没有什么不同。
这是一个简单的问题 - C++ 程序通常 return 一个 32 位 int。如果我return -1
,然后从终端打印结果,结果是255
.
这是为什么?我觉得 link 这是我应该知道的,或者很多年前就应该注意到的 - 我以前从未真正使用过 return 代码,也没有想过它。
测试C++程序:
int main()
{
return -1;
}
编译:
g++ main.cpp -o a.out
运行:
./a.out
检查结果:
echo $?
结果:
255
我本来希望看到 2^32 - 1。
为什么结果255
不是-1
甚至4294967295
。 (2^32 - 1
)
return 值定义为 int,但退出代码的合法值仅为 0-255。
你可以把它想象成操作系统在内部执行 (unsigned char)main()。
根据评论请求添加解释:
- 只有低八位被解释的事实定义在
POSIX(参见
exit
函数文档)。不同的操作系统可能有不同的看法
- 就机器代码而言,重要的是要认识到您的 main 函数可能不是您程序的真正入口点。程序的真正入口点由 C 库提供,负责设置环境和调用
main
。它还负责接受 return 值并调用 exit(your_return_value)
。但正如其他人所指出的,这是一个实现细节,而不是 C 标准的一部分(C 和 posix 之间存在差异,尽管它们重叠)。
因为(不是全部)OS 使用了整个 return 值。在这种情况下,它是 t运行cated 到低 8 位。这取决于OS(以及其他相关组件,例如shell)到"use"和"retain"这个值,这就是所谓的"implementation detail",换句话说,C 和 C++ 标准没有说明 return 值的用途或意义是什么 [除了下面的段落] - 只是从 C 的角度来看它是一个 int
- C 程序可能会在该值被忽略的环境中启动,t运行cated、扩展或乘以 432,它仍然是一个有效的 C 或 C++ 环境。
C 标准表示值 0
或 EXIT_SUCCESS
(据我所知应该为零值)和值 EXIT_FAILURE
(一些非零值)应分别视为成功和失败。但是,所有其他值都是 "implementation defined",因此根据执行发生的 OS/environment 的规则。
请注意,当 shell(或任何 运行 是您的程序时),它不会直接跳转到您的 main
,而是首先执行一些其他功能来初始化事物您的 main
功能需要的。一旦 main
有 returned/exited,通常也会有一些代码在您的程序之后执行。具体如何工作取决于几件事:
- 编译器是谁写的and/or运行时间库
- OS 它的设计目的是什么
- 它是什么处理器架构
- 可能是什么 shell/runtime/OS 功能启动了这个过程
C 和 C++ 标准没有定义这些东西,因为这样做可能会影响 can/will 运行 C and/or C++ 应用程序的实际平台,以及C 和 C++ 是 "be inclusive" - 换句话说,尽量不限制语言支持的环境、处理器等。
请注意,我是 运行 一台 linux 机器,尽管我认为 windows(或其他)机器上的结果没有什么不同。
这是一个简单的问题 - C++ 程序通常 return 一个 32 位 int。如果我return -1
,然后从终端打印结果,结果是255
.
这是为什么?我觉得 link 这是我应该知道的,或者很多年前就应该注意到的 - 我以前从未真正使用过 return 代码,也没有想过它。
测试C++程序:
int main()
{
return -1;
}
编译:
g++ main.cpp -o a.out
运行:
./a.out
检查结果:
echo $?
结果:
255
我本来希望看到 2^32 - 1。
为什么结果255
不是-1
甚至4294967295
。 (2^32 - 1
)
return 值定义为 int,但退出代码的合法值仅为 0-255。
你可以把它想象成操作系统在内部执行 (unsigned char)main()。
根据评论请求添加解释:
- 只有低八位被解释的事实定义在
POSIX(参见
exit
函数文档)。不同的操作系统可能有不同的看法 - 就机器代码而言,重要的是要认识到您的 main 函数可能不是您程序的真正入口点。程序的真正入口点由 C 库提供,负责设置环境和调用
main
。它还负责接受 return 值并调用exit(your_return_value)
。但正如其他人所指出的,这是一个实现细节,而不是 C 标准的一部分(C 和 posix 之间存在差异,尽管它们重叠)。
因为(不是全部)OS 使用了整个 return 值。在这种情况下,它是 t运行cated 到低 8 位。这取决于OS(以及其他相关组件,例如shell)到"use"和"retain"这个值,这就是所谓的"implementation detail",换句话说,C 和 C++ 标准没有说明 return 值的用途或意义是什么 [除了下面的段落] - 只是从 C 的角度来看它是一个 int
- C 程序可能会在该值被忽略的环境中启动,t运行cated、扩展或乘以 432,它仍然是一个有效的 C 或 C++ 环境。
C 标准表示值 0
或 EXIT_SUCCESS
(据我所知应该为零值)和值 EXIT_FAILURE
(一些非零值)应分别视为成功和失败。但是,所有其他值都是 "implementation defined",因此根据执行发生的 OS/environment 的规则。
请注意,当 shell(或任何 运行 是您的程序时),它不会直接跳转到您的 main
,而是首先执行一些其他功能来初始化事物您的 main
功能需要的。一旦 main
有 returned/exited,通常也会有一些代码在您的程序之后执行。具体如何工作取决于几件事:
- 编译器是谁写的and/or运行时间库
- OS 它的设计目的是什么
- 它是什么处理器架构
- 可能是什么 shell/runtime/OS 功能启动了这个过程
C 和 C++ 标准没有定义这些东西,因为这样做可能会影响 can/will 运行 C and/or C++ 应用程序的实际平台,以及C 和 C++ 是 "be inclusive" - 换句话说,尽量不限制语言支持的环境、处理器等。