【问题标题】:Integer conversion to long in assignment contexts [duplicate]在赋值上下文中将整数转换为 long [重复]
【发布时间】:2016-01-07 14:17:32
【问题描述】:

我对 Java 如何使用 long 和 int 感到困惑...

获取以下代码:

long l1 = 0xFF00000000000000L;
System.out.println(Long.toHexString(l1));
l1 = 15;
System.out.println(Long.toHexString(l1));

我假设用这条线

l1 = 15;

数字 15 默认为 int,因此只会将 32 位复制到 l1 变量,并且不会影响 long 变量的高 32 位。

换句话说,我希望输出是

ff00000000000000
ff0000000000000f

相反,我得到了

ff00000000000000
f

为什么?

【问题讨论】:

  • 为什么你认为将 new 值赋给变量会保留 old 值的一部分?
  • 您为变量分配了一个值15,并且您希望它的值是-72057594037927921?!
  • 听起来你是从 Cobol 来的?
  • 我认为将int的32位复制到long的最简单方法是longVal = longVal & 0xFFFFFFFF00000000L | intVal & 0x00000000FFFFFFFFL
  • 确实,我提出了一个愚蠢的问题,事情就是因为我认为常数默认为 int.... 我认为:l1 = 15L --> 分配了 64 位,并且使用 l1 = 15 --> 只有 32 位被分配为 15 个默认值给 int 类型)。但显然不是。那么使用 L 后缀的目的是什么?

标签: java type-conversion assignment-operator


【解决方案1】:

您将l1 定义为long,因此如果您进行分配,总会分配一个完整的long

如果您尝试分配 int,则 int 将首先转换为 long,然后再分配。转换是实际转换,因此附加位设置为零(或将原始数字表示为 long 所需的任何值)。

在大多数情况下,Java 对开发人员完全隐藏了内存管理的细节。因此,您所描述的效果并不是 Java 开发人员生活的一部分。

您的意图可以通过位运算符来完成。我几乎从不使用它们,但这可能有用:

l1 = (l1 & 0xffffffff00000000L) | 15

【讨论】:

  • 附加位设置为零有点误导,因为如果 int 为负,它们设置为 1。显然这里不是这样,但值得一提。
  • @PaulBoddington 正确。
【解决方案2】:

15 int 在赋值前很久就变成了 15。 Java 将为您做到这一点,以防止您遇到可怕的错误。想象一下,如果您将数字 15 int 分配给 long 并且仅仅因为您没有意识到您将 int 分配给 long 而您得到了一个不同的数字。

【讨论】:

  • 确实如此。即使有明确的演员表: l1 = (int) 15;我仍然得到相同的结果没有办法只复制前 32 位吗?
  • @ChrisPeeters 可以通过按位操作:l1 = (l1 & ffffffff00000000) | 15 可能会满足您的需求。
【解决方案3】:

对于l1 = 15;,数字15 被解释为代表15long,其位为000000000000000f15 被强制转换为 long 类型,因为您将其分配给 long. When printed this results inf`。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2021-07-26
    • 2017-10-03
    • 2021-02-01
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多