Long 的大小为 8 个字节,那么 JAVA 中的 float(4 bytes) 怎么可能是 'promoted'?

Long is of size 8 bytes then how can it be 'promoted' to float(4 bytes) in JAVA?

我读到在 Java 中 long 类型可以提升 float 和 double ( http://www.javatpoint.com/method-overloading-in-java )。我想问一下 long integer 在 JAVA 中占用 8 个字节的内存,而 float 占用 4 个字节,那么这个提升是如何工作的?如果我们以这种方式推广,我们是否有可能面临一些数据丢失?

另外值得注意的是,所有其他类型的提升都是从较小的原始数据类型到类似或较大的数据类型。

long 使用更多字节,但范围更小:虽然 long 不能超过 263,但 float 可以超过到大约 2127。显然,范围的扩大是以降低精度为代价的,但是由于float的范围更大,所以从longfloat的转换是一种提升。

float 的表示方式与整数类型不同。有关浮动类型的更多信息,请阅读:https://en.wikipedia.org/wiki/Single-precision_floating-point_format。煮熟的内容看起来像这样:浮点格式由一个符号位、8 位指数和 23 位值的小数部分组成。该值的计算方式如下:(-1)^signbit * 1.fractionalpart * 2 ^ (exponent - 127)。因此,该算法允许表示比 64 位整数类型更大的值。

此快速测试应说明原因:

public class Main {

    public static void main(String[] args) {
        System.out.println("Float: " + Float.MAX_VALUE);
        System.out.println("Long: " + Long.MAX_VALUE);
    }
}

输出:

Float: 3.4028235E38
Long: 9223372036854775807

注意 Float 行中的科学记数法。 Float 占用较少 space,但由于其表示形式,它可以容纳比 Long 更大的数字。