性能问答>使用溢出和循环在 C 中查找最大值>
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编译器命令行选项来实现这一点。

1月前