有一天,在一个论坛中,我对原始布尔数据类型进行了讨论。有一个人说ALL
语言true
内部(或本地)被视为-1。这是真的吗?
答案 0 :(得分:11)
这实际上是JVM规范的一部分,至少在某些方面 - 并且不是 -1。该规范的Section 3.3.4有这样的说法:
虽然Java虚拟机定义了一个布尔类型,但它只提供非常有限的支持。没有专门针对布尔值操作的Java虚拟机指令。相反,Java编程语言中对布尔值进行操作的表达式将被编译为使用Java虚拟机int的值 数据类型。
Java虚拟机直接支持布尔数组。它的newarray指令可以创建布尔数组。使用字节数组指令baload和bastore.2
访问和修改boolean类型的数组Java虚拟机使用1表示布尔数组元素,表示为true,0表示false。编译器将Java编程语言布尔值映射到Java虚拟机类型int的值时,编译器必须使用相同的编码。
作为一个例子:
public static boolean returnFalse() {
return false;
}
public static boolean returnTrue() {
return true;
}
汇编为:
public static boolean returnFalse();
Code:
0: iconst_0
1: ireturn
public static boolean returnTrue();
Code:
0: iconst_1
1: ireturn
答案 1 :(得分:3)
不,这不是真的。在C中,任何非零值都将在布尔上下文中解释为true,但==
和&&
之类的操作将返回1表示true。在Python中,True
与任何整数都不同,但True == 1
返回True
;在旧版本中,使用了1
。我认为-1
在BASIC家族中是传统的;肯定是在QBasic和pre-.Net Visual Basic中的情况。
在Java中,true
并未“被视为”-1
...布尔值和整数是无法比较的单独类型。内部表示取决于实现。
答案 2 :(得分:0)
我不知道ALL
种语言,但是java boolean与数值不同。
答案 3 :(得分:0)
这取决于JVM的实现。
答案 4 :(得分:0)
布尔值的低级内部表示是一个特定于平台的问题。但是,由于Java通常(总是?)使用C / C ++实现,因此布尔值很可能与在C / C ++中处理布尔值的方式相同。即,0定义为FALSE
,其他任何定义为TRUE
。
答案 5 :(得分:0)
-1可以是两个补码值-1的结果,即所有位都设置。实际占用的内存是JVM依赖的,可以是从一个位到32位整数的任何内容。据我所知,大多数JVM都将boole模型设为int。
答案 6 :(得分:0)
实际上,我所知道的唯一使用-1为真的语言是Visual Basic人员的VARIANT_BOOL。而且他们只是因为语言的限制而做到了这一点(只有按位逻辑操作并没有成为我下注的好主意。)