gpt4 book ai didi

java - C# 和 Java 规范在有符号整数溢出时是否阐明了相同的行为?

转载 作者:搜寻专家 更新时间:2023-10-30 20:53:59 25 4
gpt4 key购买 nike

在 C 和 C++ 中,有符号整数溢出或下溢的行为是未定义的。

在 Java 和 C#(未经检查的上下文)中,行为似乎在一定程度上被定义。


根据 Java 规范,我们有:

The integer operators do not indicate overflow or underflow in any way.

和:

The Java programming language uses two's-complement representation for integers [...]


根据 C# 规范,我们有:

[...] In an unchecked context, overflows are ignored and any high-order bits that do not fit in the destination type are discarded.


通过测试两者,我得到了预期的环绕结果。从规范的措辞来看,我觉得在 Java 中结果是可移植的(因为语言需要 2 的补码表示),而 C# 可能有也可能没有那个结果(因为它似乎没有指定表示 -只有高阶位被丢弃)。

那么,两种语言规范是否保证在所有平台上的行为相同(只是措辞不同)?还是在我的测试用例中(在 x86 上以及在 Sun 的 JRE 和 Microsoft 的 .NET 下)它们只是碰巧彼此相同,但理论上在其他体系结构或实现上可能不同?

最佳答案

在 Java 中,可移植性由 Java Language Specification 确保它陈述了关于原始类型 int 被签名的 32 位 2 的补码整数的所有规则。然后标准库本身实现了 Integer 类,它包装了 int 值并添加了一些方便的方法,但就范围和溢出而言本质上是相同的。

在 .NET 中,也有 CLR 定义的基本类型,这些类型也根据语言由不同的类和别名包装。参见 Common Language Specification - esp. Common Type Systtem .

因此,为了回答您的问题,在 Java 中,代码是可移植的,正如语言规范和 JVM 实现所确保的那样。在 .NET 中(因为 CLR 也运行 C++ 代码,而 C++ 代码反过来可能不符合 CLS,在更接近铁级别的情况下运行)你必须确保你的代码是可移植的 CLS Compliant .好消息是,使用 int 和/或 System.Int32 可以使您符合 CLS,因此可移植。

关于java - C# 和 Java 规范在有符号整数溢出时是否阐明了相同的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34579264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com