java如何比较两种不同大小的原始数据类型

java如何比较两种不同大小的原始数据类型,java,types,primitive,primitive-types,Java,Types,Primitive,Primitive Types,在Java中,如何比较两种不同的基本数据类型,如inta=3和byte b=3 我注意到int的大小是4个字节,而byte只有1个字节。它是按位比较吗?它不是。永远不会 int a = 3; byte b = 3; if (a == b) { ... } 这不是int和字节之间的比较=只能比较相同类型的原语。这是int和int之间的比较(因为int是两者中较宽的一个)。它相当于下面更显式的代码 int a = 3; byte b = 3; if (a == (int)b) { ...

在Java中,如何比较两种不同的基本数据类型,如
inta=3
byte b=3


我注意到
int
的大小是4个字节,而
byte
只有1个字节。它是按位比较吗?

它不是。永远不会

int a = 3;
byte b = 3;
if (a == b) {
  ...
}
这不是
int
字节之间的比较<代码>=
只能比较相同类型的原语。这是
int
int
之间的比较(因为
int
是两者中较宽的一个)。它相当于下面更显式的代码

int a = 3;
byte b = 3;
if (a == (int)b) {
  ...
}

除了几个例外,至少在概念上,在进行比较之前,较小的类型会转换为较大的类型


实际比较通常由直接在CPU上的机器代码指令执行。如今,这种比较不会一点一滴地进行;将同时比较所有位。

如果对小于int的基本数据类型(即字节、短字符或字符)执行任何数学或逐位操作,则在执行操作之前,这些值将提升为int

考虑以下代码段和生成的字节码:

int  a = 1;
byte b = 1;

if (a == b) {
}

public static main([Ljava/lang/String;)V
   L0
    ICONST_1
    ISTORE 1
   L1
    ICONST_1
    ISTORE 2
   L2
    ILOAD 1
    ILOAD 2
    IF_ICMPNE L3
   L3
    RETURN

从上面的示例中可以看出,两个常量(a、b)都是以
ICONST
指令作为
int
常量推送到操作数堆栈上的。

它是通过一个不会丢失信息的过程来执行的。

float和long是此规则的一个重要例外。Java规范中对此进行了详细说明。