0

为什么这个表达式总是导致 -2,147,483,648 (11111111 11111111 11111111 11111111)?我不明白。data[] 是一个填充了一些值的字节数组。

(((int)data[29] & 0x00000001) << 31) | (((int)data[30]&0x000000FF)<<12) | (((int)data[31]&0x000000FF)<<4) | (((int)data[32]&0x000000FF)>>>4)

谢谢。

4

1 回答 1

0

我认为您的表达式并不总是返回带符号整数的最小值。如果data数组中的所有值都为零,则它将返回零。

我也不认为这会导致将所有位设置为 1。

我使用以下代码(Java)Integer.MAX_VALUE

int max = Integer.MAX_VALUE;    //(2^31 - 1) - all bits apart from the sign are 1
System.out.print(Integer.toBinaryString(((max & 0x00000001) << 31) | ((max&0x000000FF)<<12) | ((max&0x000000FF)<<4) | ((max&0x000000FF)>>>4)));

返回:

10000000000011111111111111111111

使用提供的值:

System.out.print(Integer.toBinaryString(
        ((0b00101001 & 0x00000001) << 31) |
        ((0b11111111 & 0x000000FF) << 12) |
        ((0b11111001 & 0x000000FF) << 4)  |
        ((0b11001111 & 0x000000FF ) >>> 4))
);

返回:

10000000000011111111111110011100
于 2017-12-19T17:32:41.777 回答