按位运算的错误结果 r << 24,为什么?

Wrong result for bitwise operation r << 24, why?

我有一个枚举:

public enum STAR_TYPE {
    FAST(255, 255, 255),
    NORMAL(190, 190, 190),
    SLOW(120, 120, 120);

    private int color;

    private STAR_TYPE(int r, int g, int b) {
        int R = r << 24;
        int G = g << 16;
        int B = b << 8;
        color = R | G | B | 0xff;
    }

    public static STAR_TYPE getRandomType() {
        return values()[MathUtils.random(0, values().length - 1)];
    }

    public int getColor() {
        return color;
    }
}

我想将 RGBA 值转换为透明度始终为 255 的整数。为此,我正在使用按位运算。但是 r << 24 不起作用。它 return 是错误的结果。

对于 255 r << 24 应该 return 4278190080 但它 returns -16777216.

对于 190 r << 24 应该 return 3187671040 但它 returns -1107296256.

只有 120 r << 24 returns 2013265920 的正确结果。

我发现计算的值是有符号 2 的补码的小数。很高兴知道,但我从来没有要求过这个。我想要积极的价值。 我怎样才能得到想要的值?我很困惑。

你误解了这是负面的事实。

您正在将四个 8 位值打包成一个 32 位值:

RRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA

如果设置了最高有效位,最左边的R位(即你的R值至少为128),对应的32位int值为负。

但是,就整数值而言,这实际上没有任何意义。从某种意义上说,您是在滥用 int 数据类型,使用它来存储四个 8 位值。恰好一些生成的 32 位值也用于表示负数。