为什么'0xcafebabe'代表Scala和Python中的不同数字?

Jud*_*ing 2 python scala

这是代码和结果:

python2.7 >>> 0xcafebabe
3405691582

scala2.10.4> 0xcafebabe
res0: Int = -889275714
Run Code Online (Sandbox Code Playgroud)

为什么Scala中十六进制数'0xcafebabe'为负数?

PS:我发现它与Int的溢出有关.但是当我将变量指定为Long时,为什么它仍然不如预期?

scala> val aa = 0xcafebabeL
aa: Long = 3405691582

scala> val aa1:Long = 0xcafebabe
aa1: Long = -889275714
Run Code Online (Sandbox Code Playgroud)

PS 2:当我尝试使用3405691582将变量评估为Int时,Scala提示符会抱怨error: integer number too large,而如果应用0xcafebabe,则不会引发错误.这是为什么?

scala> val aa:Int = 3405691582
<console>:1: error: integer number too large
       val aa:Int = 3405691582
                    ^

scala> val aa:Int =  0xcafebabe
aa: Int = -889275714
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 5

Python具有任意精度的整数,因此范围int是无限的,类似于BigIntScala,而在Scala中,非限定的整数文字映射到Java类型int.Java int具有32位精度,范围为-0x80000000到0x7FFFFFFF.

由于0xcafebabe0xdeadbeef具有符号位组,他们是intS IN Java和其他JVM语言; 它们被评估为两个补码,如-0x21523502.这不是溢出问题,而是标准行为问题.在JVM中,没有无符号值类型,并且int用于位域,其中可以根据需要设置,测试和取消设置所有32位; 对于这种情况,通常使用正十六进制常量来设置所有值0x00000000,0xFFFFFFFF对于所有设置的位都没有设置.

在Scala中,0xcafebabe如果你把它作为Long文字,你可以有积极性:尝试0xcafebabeL.这将被3405691582LScala 理解.

在JVM中,溢出是为数学运算定义的; 计算总是按照二进制补码进行; 您可以将此视为整数溢出的示例,但事实并非如此,因为编译器只是将其视为0xcafebabe-889275714文字完全相同.

  • 因为0xcafebabe是一个负32位数,而3405691582是一个正64位数,我认为这是从Antti的解释.@Judking (2认同)