使用int范围内的int文字从long到int进行有损转换

我确实知道,只要不进行强制转换,长字面量就不适合int变量:

long y = 1000000L;
int x = y;  // error - lossy conversion

我不明白的是为什么在int范围内使用int文字会产生相同的错误:

long y = 100;
int x = y;  // error - lossy conversion

整数的默认文字是'int',那么为什么我不能执行这种操作? 唯一的答案是因为Java在声明一个变量为long的同时,将该值存储为long值,即使我没有附加“ L”后缀,但我还是希望有一个“正式的”解释。>

lewode 回答:使用int范围内的int文字从long到int进行有损转换

即使您在y中存储的值足够小以适合int变量,也可以稍后将新值分配给该变量,而稍后的值可能不适合int

由于这种分配可能在运行时发生,因此编译器无法确保分配始终为值。

编译器无法静态分析您的所有代码以验证分配将始终有效。尽管在您的简单示例中看起来很容易验证,但总的来说这并不简单。

,

您的问题一开始看起来很简单,但是经过一番研究,我发现了一个我以前从未听说过的概念-隐式类型转换

正如您所说,用于int和long的内存大小是不同的: int-32位有符号整数 长-64位带符号整数

并且将长值分配给int的问题是由于大小差异。 编译器将不会对您的long值执行数字运算,以检查其是否适合32位有符号整数。 例如数字1在内存中的表示方式有所不同:

int 1是“ 00000000 00000000 00000000 00000001”(32位)。

long 1是“ 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001”(64位)。

因此我们无法对不兼容的数据类型执行隐式类型转换。将long int转换为int会导致丢弃多余的高阶位。

反之亦然! 它称为隐式类型转换或类型提升,因此,您可以将int分配给long变量。

java基本类型深入 https://www.ntu.edu.sg/home/ehchua/programming/java/J2_Basics.html

关于类型提升 http://www.java2s.com/Tutorials/Java/Data_Types/What_is_Java_type_promotion.htm

本文链接:https://www.f2er.com/3160212.html

大家都在问