The*_*kis 13 c# java integer-overflow code-conversion language-lawyer
在C和C++中,未定义有符号整数上溢或下溢的行为.
在Java和C#(未经检查的上下文)中,行为似乎在某种程度上被定义.
从Java规范,我们有:
整数运算符不以任何方式指示上溢或下溢.
和:
Java编程语言对整数使用二进制补码表示[...]
从C#规范,我们有:
[...]在未经检查的上下文中,忽略溢出,并且丢弃不适合目标类型的任何高位.
通过测试两者,我得到了预期的环绕结果.从规范的措辞来看,我感觉在Java中结果是可移植的(因为语言需要2的补码表示),而C#可能有也可能没有结果(因为它似乎没有指定表示 - 只有高阶位被丢弃).
那么,两种语言规范是否都能在所有平台上保证相同的行为(只是用不同的措辞)?或者他们在我的测试用例中(在x86上和Sun的JRE和Microsoft的.NET下)恰好相同,但理论上在其他架构或实现方面可能有所不同吗?
在 Java 中, Java 语言规范确保了可移植性,该规范规定了有关基本类型的所有规则int,即带符号的 32 位 2 的补码整数。然后标准库本身实现了Integer包装值的类int并添加了一些方便的方法,但就范围和溢出而言本质上是相同的。
在 .NET 中,CLR 也定义了原始类型,并且根据语言的不同,这些类型也由不同的类和别名包装。请参阅公共语言规范 - 尤其是。通用类型系统。
因此,回答你的问题,在Java中,代码是可移植的,这是由语言规范和 JVM 实现所保证的。在.NET中(因为 CLR 还运行 C++ 代码,而 C++ 代码又可能在接近铁级别的情况下不符合 CLS 兼容),您必须通过使其符合 CLS 来确保代码的可移植性。好消息是,使用int和/或System.Int32使您符合 CLS,因此可移植。