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