【问题标题】:Why does return value wrap around 256 in c [duplicate]为什么返回值在c中环绕256 [重复]
【发布时间】:2012-06-08 08:49:20
【问题描述】:

可能重复:
What is the valid range for program return value in Linux/bash?

这是一个简单的c程序:

#include <stdio.h>
int main(){
    int a=0, b=100;
    while(a<=b){
        printf("%d\n",a);
        a+=10;
    }
   return a;
}

在 linux 上检查返回值会得到 110,这是预期的,因为程序中评估的最后一个表达式是将 110 赋值给 a; 但是当我用大于 256 的东西替换 b=100 时,说 b=260;返回值为 14 而不是预期的 270。 为什么 main 应该返回范围远大于 256 的整数时,返回值会环绕 256?

【问题讨论】:

  • therefromhere ,感谢您的链接.. 这确实是同一个问题。 :-)
  • 由于您没有明确的 return 语句,因此实际值未定义。在大多数情况下,它将是某个特定结果寄存器或累加器中的值,但不能保证这一点,例如始终输出零同样有效。这个问题在明确的 return 语句中同样有效,而且不那么模棱两可。在 C not 中,对于非 void main 具有显式返回语句也是无效的,并且在 C++ 中,在任何情况下具有隐式返回类型都是无效的,因此这是无效的两种语言的代码。
  • @Clifford:自C99以来,到达main中的终止},如果返回类型与int兼容,则返回0。如果返回类型与@987654327不兼容@,返回状态未指定。很多人写了main 却没有返回,现在在main 中没有一个是合法的。
  • @Daniel:我的立场是正确的,但如果不依赖此代码,代码也可以证明这个问题。

标签: c unix return-value


【解决方案1】:

来自 POSIX 页面:

status 的值可以是 0、EXIT_SUCCESS、EXIT_FAILURE、[CX] 或任何其他值,但只有最低有效 8 位(即 status & 0377)可供等待的父进程使用。

http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html

【讨论】:

  • 感谢您的正确答案 ouah。但是我已经得到了正确的答案并接受了它。再次感谢:-)
【解决方案2】:

不幸的是,在基于 Unix 的系统中就是这种情况。即使您将返回类型指定为int,您也不能从main 返回大于255 的值。阅读here

Windows 在使用 32 位有符号整数作为退出代码的意义上更加宽容

另外,你不能假设返回值总是最后一个表达式的值。如果没有明确的return 语句,则返回值的推断方式取决于架构。例如,on ARM systems,它的值在R0(有时是R0+R1)寄存器和x86 系统上它的EAX 寄存器。

【讨论】:

  • Pranav Manjunath 现在这是,我现在了解 un*x 机器。谢了哥们。 :) 现在事情似乎又合乎逻辑了……
【解决方案3】:

这不仅是您没有指定返回类型,还缺少 return 语句。您不返回任何内容,因此程序返回的内容完全是随机的,无论函数退出时相关寄存器/内存位置发生了什么。

【讨论】:

  • 用 int main 替换 main 并添加 return a;因为程序结束前的最后一行显示了相同的行为。它在我的机器上返回 14 而不是 270。解释一下?
  • @drake:当然可以,这就是您应该发布的内容! (编辑它还为时不晚)。如果只是为了避免人们处理您的严格无效代码而不是提供您正在寻找的答案的“噪音”。
  • 虽然是一个有效的观点,但这是评论而不是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多