按位左移行为

Dan*_*Dan 5 java bitwise-operators

今天我正在学习左移位操作符(<<).据我所知,左移位操作符按指定向左移动位.而且我知道转移乘以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
}
Run Code Online (Sandbox Code Playgroud)

更新(新疑点):

它是什么意思"如果你将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?
         */
    }
}
Run Code Online (Sandbox Code Playgroud)

Zon*_*ong 5

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

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

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

01000000
Run Code Online (Sandbox Code Playgroud)

shift运算符将值提升为int:

00000000000000000000000001000000
Run Code Online (Sandbox Code Playgroud)

然后左移2位:

00000000000000000000000100000000
Run Code Online (Sandbox Code Playgroud)

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

00000000
Run Code Online (Sandbox Code Playgroud)

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