在Java中,为按位运算假设一定大小的基本类型是否安全?

时间:2009-04-20 14:15:31

标签: java 64-bit

鉴于Java的“一次编写,随处运行”范例以及Java教程为所有原始数据类型提供显式位大小这一事实,而没有丝毫暗示这依赖于任何东西,我会说,是的,一个{ {1}}总是32位。

但有什么警告吗? language spec定义了值范围,但没有说明内部表示,我猜它可能不应该。但是,我有一些代码对假定32位宽度的int变量执行按位操作,我想知道该代码在所有架构上是否安全

这类问题是否有很好的深入资源?

5 个答案:

答案 0 :(得分:13)

无论本机架构如何,Java代码总是像32位一样工作。

在规范中,还有a part对表示具有明确性:

  

整数类型是byte,short,int和long,其值分别是8位,16位,32位和64位二进制补码整数,以及char,其值为16-表示UTF-16代码单元的位无符号整数

答案 1 :(得分:6)

虽然Java语言的行为是完全准确地在语言规范中指定的,但有一点需要注意:在64位结构中,整数可能是单词对齐的,这意味着一个整数数组(或任何非整数) -64bit原始类型)可能需要两倍于32位架构的内存。

答案 2 :(得分:1)

是的,Java中没有sizeof运算符。

根据Bruce Eckel的 Thinking in Java

  • short:16位
  • int:32位
  • long:64位

这些值在架构之间不会有所不同。

答案 3 :(得分:1)

您也可以检查JVM specs:每个按位操作获取它的操作码(ISHL,IOR,IAND等)

答案 4 :(得分:-1)

这不是一个答案,因为已经有了一个很好的答案,但我想我会指出Java之所以如此,但不是C或C ++的原因是Java编译成虚拟机( Java VM或JVM)。因为JVM运行相同的字节码并且具有相同的内部结构,无论它在哪台机器上,它似乎在每台机器上具有相同的原始类型大小。 C和C ++并没有试图模仿任何特定的行为,而是受到各种机器上处理器实现的影响。