任务是通过循环找到最大的 int 值。我在 C 和 Java 中几乎有完全相同的代码。在 Java 中它工作正常,但在 CI 中得到最小值,我想知道为什么。
C
#include <stdio.h>
int main() {
int i = 0;
for (; i+1 > 0; i++) { }
printf("%d", i);
return 0;
}
爪哇
public class Java {
public static void main(String[] args) {
int i = 0;
for (; i+1 > 0; i++) { }
System.out.println(i);
}
}
您的代码似乎错误地假设在 C 中, an保证在overflowint
上包装为负数。这个假设是错误的。这样的有符号整数溢出将在 C 中调用未定义的行为,因此如果让这种情况发生,则不能依赖任何特定的行为。
为了找到 的最大可表示值,您可以使用在中定义int
的宏常量。INT_MAX
limits.h
但是请注意,只有有符号整数溢出才会调用 C 中的未定义行为。与此相反,当使用无符号数字时,它们保证以明确定义的方式包装。因此,您可以unsigned int
使用您的方法找到最大的可表示对象。
此外,一些编译器有一个设置会导致有符号整数溢出的行为变得明确(假设您的硬件支持它并使用二进制补码来表示有符号数,这可能就是这种情况)。在 gcc 和 clang 中,您可以使用-fwrapv
编译器命令行选项来实现这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句