C# 和 Java 规范是否在有符号整数溢出上阐明了相同的行为?
2022-09-04 23:24:49
在 C 和 C++ 中,有符号整数溢出或下溢的行为是未定义的。
在Java和C#(未经检查的上下文)中,行为似乎在一定程度上被定义。
从Java规范中,我们有:
整数运算符不以任何方式指示溢出或下溢。
和:
Java编程语言使用二进制补码表示整数[...]
从 C# 规范中,我们有:
[...]在未经检查的上下文中,将忽略溢出,并丢弃任何不适合目标类型的高阶位。
通过测试两者,我得到了预期的环绕结果。从规范的措辞来看,我感觉在Java中结果是可移植的(因为该语言需要2的补码表示),而C#可能有也可能没有这个结果(因为它似乎没有指定表示 - 只是丢弃了高阶位)。
那么,这两种语言规范是否保证在所有平台上都具有相同的行为(只是措辞不同)?或者它们只是碰巧在我的测试用例中彼此相同(在x86上,在Sun的JRE和Microsoft的.NET下),但在理论上在其他架构或实现上可能会有所不同?