gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:16:28 25 4
gpt4 key购买 nike

这是代码和结果:

python2.7 >>> 0xcafebabe
3405691582

scala2.10.4> 0xcafebabe
res0: Int = -889275714

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

P.S.:我发现它与Int的溢出有关。但是当我指定一个变量为 Long 时,为什么它仍然不符合预期?

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

scala> val aa1:Long = 0xcafebabe
aa1: Long = -889275714

附言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

最佳答案

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

0xcafebabe0xdeadbeef设置了符号位,它们是负数,如int Java 和其他 JVM 语言中的 s;它们被评估为 two's complement , 作为 -0x21523502 .这不是溢出问题,而是标准行为。在 JVM 中没有无符号值类型,int用于可以根据需要设置、测试和取消设置所有 32 位的位域;对于这种情况,通常使用正十六进制常量来设置来自 0x00000000 的所有值。没有位设置为 0xFFFFFFFF对于所有位集。

在 Scala 中,你可以有正数 0xcafebabe如果你把它设为 Long文字:试试 0xcafebabeL .这将被理解为 3405691582L斯卡拉。

在 JVM 中,溢出对于数学运算是明确定义的;计算总是根据二进制补码进行;您可以将此视为整数溢出的示例,但事实并非如此,因为编译器只考虑这个 0xcafebabe-889275714 完全相同字面意思。

关于python - 为什么 '0xcafebabe' 在 Scala 和 Python 中代表不同的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28513189/

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