5

今天我正在学习左移位运算符(<<)。据我了解,左移位运算符按指定向左移动位。而且我也知道乘以 2 进行移位。但我很困惑,就像“移位位”的确切含义是什么,为什么当值被分配不同的类型时输出会有所不同?

当我调用下面的函数时,它的输出为System.out.println("b="+b); //Output: 0

我的问题是: b 如何变成 0 以及为什么 b 被类型转换?

public void leftshiftDemo()
{
    byte a=64,b;
    int i;
    i=a << 2;
    b=(byte)(a<<2);
    System.out.println("i="+i); //Output: 256    i.e 64*2^2
    System.out.println("b="+b); //Output: 0   how & why b is typecasted
}

更新(新疑问):

这是什么意思“如果将 1 位移到高位(位 31 或 63),则该值将变为负数”。例如。

public void leftshifHighOrder()
{
    int i;
    int num=0xFFFFFFE;

    for(i=0;i<4;i++)
    {
        num=num<<1;
        System.out.println(num);
        /*
         * Output:
         * 536870908
         * 1073741816
         * 2147483632
         * -32   //how this is -ve?
         */
    }
}
4

5 回答 5

6

在 Java 中将整数转换为字节时,仅保留最低位:

有符号整数到整数类型 T 的窄化转换只会丢弃除 n 个最低位之外的所有位,其中 n 是用于表示类型 T 的位数。此外,可能会丢失有关数值大小的信息,这可能会导致结果值的符号与输入值的符号不同。

在这种情况下,字节64具有以下二进制表示:

01000000

shift 运算符将值提升为 int:

00000000000000000000000001000000

然后将其左移 2 位:

00000000000000000000000100000000

然后我们将它转​​换回一个字节,所以我们丢弃除了最后 8 位之外的所有位:

00000000

因此最终的字节值为0. 但是,您的整数保留了所有位,因此它的最终值确实是256.

于 2013-11-07T15:03:01.403 回答
2

在 java 中,整数是有符号的。为了表示这一点,使用了2 的补码。在此表示中,任何将其高位设置为 1 的数字都是负数(根据定义)。

因此,当您将第 31 位的 1 左移(即 int 的最后一位)时,它变为负数。

于 2013-11-07T17:27:52.103 回答
1
i = a << 2;

在记忆中:

  • 将a(8位)加载到regitry R1(32位)中
  • 将注册表 R1 向左移两个位置
  • 将注册表 R1(32 位)分配给变量 i(32 位)。

b = (byte)(a << 2);

在记忆中:

  • 将a(8位)加载到regitry R1(32位)中
  • 将注册表 R1 向左移两个位置
  • 将注册表 R1(32 位)分配给变量 b(8 位)。<- 这就是为什么需要强制转换(字节)以及为什么它们只得到移位操作的最后 8 位的原因
于 2013-11-07T15:06:11.490 回答
0

移位的确切含义正是它听起来的样子。:-) 你把它们移到左边。

0011 = 3

0011 << 1 = 0110

0110 = 6

于 2013-11-07T15:05:44.847 回答
0

您应该阅读 Java 中不同的数据类型及其范围。

让我简单地解释一下。

byte a=64,b;
int i;
i=a << 2;
b=(byte)(a<<2);

Java 中的 'byte' 是有符号 2 的补码整数。它可以存储从 -128 到 127 的值,包括这两个值。当你这样做时,

i = a << 2;

您将“a”左移 2 位,该值应该是 64*2*2 = 256。“i”是“int”类型,Java 中的“int”可以表示该值。

当你再次左移和类型转换时,

b=(byte)(a<<2);

您保留较低的 8 位,因此该值为 0。

您可以阅读本文以了解 Java 中的不同原始类型。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

于 2013-11-07T15:53:50.537 回答