任务是通过循环找到最大的int值.我几乎有完全相同的代码

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);
    }
}

推荐答案

您的代码似乎错误地认为,在C中,int保证在overflow上换行为负数.这种假设是错误的.这种有符号整数溢出将在C中调用undefined behavior,因此如果让这种情况发生,则不能依赖任何特定行为.

为了找到int的最大可表示值,可以使用limits.h中定义的宏常量INT_MAX.

但是请注意,只有signed整数溢出调用了C中未定义的行为.与此相反,当使用无符号数时,它们保证以定义良好的方式包装.因此,您可以使用您的方法找到最大的代表性unsigned int.

此外,一些编译器的设置会导致有符号整数溢出行为得到良好定义(假设您的硬件支持它,并使用two's complement表示有符号数,可能就是这样).在gcc和clang中,可以使用-fwrapv编译器命令行选项来实现这一点.

Java相关问答推荐

在URL类图中表示Java swing类

JUnit—如何模拟局部变量对象方法调用

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

使用联接和分页的SpringBoot Spring数据JPA

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

我找不到&Quot;配置&的位置

获取字符串中带空格的数字和Java中的字符

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

try 在Android Studio中的infoWindow中使用EditText(Java)

使用htmlunit和java单击按钮

将关闭拍卖的TimerService

EXCEL中的公式单元格显示#NAME?

将stringBuilder + forloop转换为stream + map

Java在操作多个属性和锁定锁对象时使用同步和易失性

如何处理两个几乎相同的XSD文件?

有没有办法在o(log(N))中以系统的方式将数组中的小块元素复制和移动到新增长的数组中的左侧?

在缺少字段时使用Jackson With Options生成Optional.Empty()

如何在Java中的重写方法参数中强制(Enum)接口实现?

在Spring Boot中使用咖啡因进行缓存-根据输出控制缓存

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举