鉴于Java的“一次编写,随处运行”范例以及Java教程为所有原始数据类型提供显式位大小这一事实,而没有丝毫暗示这依赖于任何东西,我会说,是的,一个{ {1}}总是32位。
但有什么警告吗? language spec定义了值范围,但没有说明内部表示,我猜它可能不应该。但是,我有一些代码对假定32位宽度的int
变量执行按位操作,我想知道该代码在所有架构上是否安全。
这类问题是否有很好的深入资源?
答案 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 ++并没有试图模仿任何特定的行为,而是受到各种机器上处理器实现的影响。