Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java自动类型促销_Java - Fatal编程技术网

Java自动类型促销

Java自动类型促销,java,Java,我引用赫伯特·席尔德的话:JAVA,第8版的完整参考资料 第4章:运营商 当您移动byte和short值时,Java的自动类型提升会产生意外的结果。如您所知,在计算表达式时,byte和short值将提升为int。此外,这种表达式的结果也是int。这意味着字节或短值上的左移位的结果将是整数,并且位左移位后的位将不会丢失,直到它们移位超过位位置31 此外,负的字节或短值在提升为int时将被符号扩展。因此,高阶位将填充1的。出于这些原因,对字节或短字节执行左移位意味着您必须放弃int结果的高阶字节。例

我引用赫伯特·席尔德的话:JAVA,第8版的完整参考资料

第4章:运营商

当您移动
byte
short
值时,Java的自动类型提升会产生意外的结果。如您所知,在计算表达式时,
byte
short
值将提升为
int
。此外,这种表达式的结果也是
int
。这意味着
字节
值上的
左移位
的结果将是
整数
,并且
左移位后的
位将不会丢失,直到它们移位超过
位置
31

此外,负的
字节
值在提升为
int
时将被符号扩展。因此,高阶位将填充
1的
。出于这些原因,对字节或短字节执行左移位意味着您必须放弃int结果的高阶字节。例如,如果将
字节
值左移,则必须先将该值提升为
int
,然后再进行移位。这意味着您必须放弃结果的第一个
3字节
,如果您想要的是移位字节值的结果。最简单的方法是将结果转换回
字节

    byte a = 64, b;
    int i;
    i = a << 2;
    b = (byte)(a<<2);
    "Binary Equivalent of b : "+Integer.toBinaryString(b); // gives 0 

    byte i1 = -5,i2;
    int s;
    s = i1<<2;
    i2 = (byte)(i1<<2);

    Integer.toBinaryString(i2); //gives 11111111111111111111111111101100   WHY?
字节a=64,b;
int i;

i=ai2
的值是(二进制)
1110 1100
或(十进制)
-20

Integer.toBinaryString(int)
的参数类型是
int
,因此
i2
被提升为
int
。这涉及符号扩展,这意味着“符号位”(负数的前导
1
,正数或零的前导
0
)被复制到所有高位,产生(二进制)111111111111111111011100
或(十进制)
-20


当您看到二进制表示时,这可能看起来很奇怪,但当您看到十进制表示时,这是有意义的。符号扩展的目的是保留实际的数值。

第二段是answer@ShirgillAnsari如果答案能解决你的问题/疑问,你应该接受它。