Java 整数在赋值上下文中转换为long

Java 整数在赋值上下文中转换为long,java,type-conversion,assignment-operator,Java,Type Conversion,Assignment Operator,我对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变量,并且不会影响长变量的较高32位 换句话说,我希望输出是 ff00000000000000 ff

我对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变量,并且不会影响长变量的较高32位

换句话说,我希望输出是

ff00000000000000
ff0000000000000f
相反,我得到了

ff00000000000000
f

为什么?

15 int在作业之前很久就被更改为15。Java将为您做到这一点,以防止出现可怕的bug。想象一下,如果您将数字15 int分配给一个long,而您得到一个不同的数字仅仅是因为您没有意识到您将一个into分配给了一个long

l1=15
数字
15
被解释为表示
15
long
,其位为
000000000000000 f
<代码>15被强制转换为
类型,因为您正在将其分配给
长。当打印时,这将导致
f`。

您将
l1
定义为一个
long
,因此如果您进行赋值,则始终会分配一个完整的
long

在尝试分配
int
的情况下,int将首先转换为
long
,然后分配。转换是一个实际的转换,因此额外的位被设置为零(或者以长的形式表示原始数字所需的任何内容)

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

使用位运算符可以完成您想要的操作。我几乎从不使用它们,但这可能有用:

l1 = (l1 & 0xffffffff00000000L) | 15

为什么您认为将新值分配给变量将保留旧值的一部分?您将
15
的值分配给变量,并且您希望它的值为
-72057594037927921
?!听起来你像是从Cobol来的?我认为把
int
的32位复制成
long
最简单的方法是
longVal=longVal&0xffffff00000000l | intVal&0x00000000FFFFFFFFL
。事实上,我提出的一个愚蠢的问题是,正如我认为常量默认为int一样。。。。我认为:l1=15L-->分配了64位,而对于l1=15-->只有32位被分配为15位(默认为int类型)。但显然不是。那么使用L后缀的目的是什么呢?确实如此。即使使用显式强制转换:l1=(int)15;我仍然得到相同的结果,是否没有办法只复制前32位?@ChrisPeeters通过按位操作是可能的:l1=(l1&ffffffff00000000)| 15可能会执行您想要的操作。如果int为负数,则额外的位设置为零有点误导性,因为它们设置为1。显然这里不是这样,但值得一提。@PaulBoddington说得对。