【问题标题】:How to convert a char to a long without first making it an int?如何在不先将其设为 int 的情况下将 char 转换为 long?
【发布时间】:2022-01-20 12:39:00
【问题描述】:

Char、int 和 long 都是整数,但还有其他大的位。

我知道,例如,如果您从整数创建 long:

int a=39; long b=a;

long中的不是64位的数,也是32位的整数。

当我们制作时:

int a=39; long b=aL;

我已经读过,如果您在 long 中添加例如 L,那么 long 也是一个 64 位的数字。但是我读到Java在内部将之前的整数视为整数,然后通过L,数字变为64位。但在此之前,数字也是短时间存储在长32位中的。

所以我读过,通常总是首先将一个 32 位的整数形成为长整数,然后将其制成 64 位。因此,即使有人做了 long test =93L;,在 long 中首先会创建一个 32 位的整数,然后用 L 对其进行扩展,从而变成 64 位。所以作为一个中间步骤,你总是有一个整数。对吗?

如果是,我怎样才能将 char 例如 char test1 ='A' 转换为 long 而不将它们转换为 32 位整数?因为如果我是对的,如果我使long test2=test1; 长整数中没有 64 位的长整数,只有一个 32 位的整数。这是真的吗?

或者说现在 long 是一个 64 位的整数?如果是这样,它之前是 32 位吗?

如果我说的是真的,我怎么能直接把 char 做成 64 位,而不是先把它变成 int 呢?

【问题讨论】:

  • 我认为这个问题不属于 Stack Overflow。对于理论问题,您可能希望将其发布在 Stack Exchange Computer Science 或类似频道中。
  • @hfontanez:这绝不是理论上的。
  • 好的,但是我怎么知道这一点,而不知道有关 java 的理论方面?
  • 需要查看生成的中间代码。但我不知道怎么做。
  • @wdqoihj2 我会先做一个只做long a = 'a';的小程序来检验你的假设,编译,反汇编,看看这个“短期32位”的业务是不是实际上是真的。

标签: java integer


【解决方案1】:

让我们尝试一个测试程序

public class Test {
    public static void main(String args[]) {
        long a = 'a';
    }
}

让我们编译它

javac Test.java

我们拆解一下

javap -c Test.class
Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc2_w        #2                  // long 97l
       3: lstore_1
       4: return
}

看这个:

0: ldc2_w        #2                  // long 97l

它直接将 97('a' 的数值)加载为long。没有中间步骤使您的值是 32 位宽。

如果您不直接执行此操作,当然会得到不同的结果,即该数字首先存储为 32 位 int,然后加载到 long 中(但您通过声明 @ 明确要求987654327@ 作为char,所以这并不奇怪)

public class Test {
    public static void main(String args[]) {
        char a = 'a';
        long b = a;
    }
}

让我们反编译一下

javap -c Test.class
Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: bipush        97
       2: istore_1
       3: iload_1
       4: i2l
       5: lstore_2
       6: return
}

【讨论】:

  • @wdqoihj2 如果您执行中间步骤,是的。我会用那个例子来修改我的答案。
  • 你知道直接把它变长的方法吗?
  • @wdqoihj2 第一个例子就是使用long a = 'a';
  • 非常感谢你,如果我们有一个数组会怎么样?在这方面,它也将是一个整数,然后是一个 long?
  • 我不确定我是否理解。我举了两个可能发生的例子。如果您将立即值直接分配给 long,它将直接作为 long 加载。如果你事先声明了一个整数,然后然后将它的值赋给一个long,编译器将不会(总是)知道你将如何使用这个整数,所以它把它声明为一个整数,当你将它分配给 long 它只是将它存储在 long 中。还要考虑到语言规范似乎没有表明如何将扩大的转换编译为字节码,并且编译器无论如何都可以优化。
【解决方案2】:

Long 是 64 位。

当您将 int 值分配给 long 变量时,该值将转换为 long。

        long a = 5;  // same as long a = (long) 5;
        long b = 5L;

【讨论】:

  • OP 已经知道这一点。 OP 想知道是直接转换为 64 位,还是中间转换为 32 位答案,然后转换为 64。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 2013-10-16
  • 2016-06-28
  • 1970-01-01
相关资源
最近更新 更多