这是代码和结果:
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)
Python具有任意精度的整数,因此范围int是无限的,类似于BigIntScala,而在Scala中,非限定的整数文字映射到Java类型int.Java int具有32位精度,范围为-0x80000000到0x7FFFFFFF.
由于0xcafebabe与0xdeadbeef具有符号位组,他们是负的intS IN Java和其他JVM语言; 它们被评估为两个补码,如-0x21523502.这不是溢出问题,而是标准行为问题.在JVM中,没有无符号值类型,并且int用于位域,其中可以根据需要设置,测试和取消设置所有32位; 对于这种情况,通常使用正十六进制常量来设置所有值0x00000000,0xFFFFFFFF对于所有设置的位都没有设置.
在Scala中,0xcafebabe如果你把它作为Long文字,你可以有积极性:尝试0xcafebabeL.这将被3405691582LScala 理解.
在JVM中,溢出是为数学运算定义的; 计算总是按照二进制补码进行; 您可以将此视为整数溢出的示例,但事实并非如此,因为编译器只是将其视为0xcafebabe与-889275714文字完全相同.