有人可以解释这种shiftwise / Long修补输出吗?

时间:2015-11-20 09:49:54

标签: java long-integer bit-shift

运行1:

#!/usr/bin/env perl
use strict;
use warnings;

my @lines;
while (<DATA>) {
    next if ( m/====/ and not m/TOTAL/ );
    push @lines, $_;
}

print $_ for @lines;

__DATA__
========
Line 1
dfa====dsfdas==
Line 2 
df  as TOTAL ============

输出:
shiftwise示例A = 1195984440
shiftwise示例B = 5136714056324874240

运行2 :(我刚刚指定&#39; L&#39;在示例A中):

===

输出:
shiftwise示例A = 5136714056324874240
shiftwise示例B = 5136714056324874240

2 个答案:

答案 0 :(得分:4)

如果您未指定L后缀,则常量字面值将被视为int§15.19 of the Java Language Specification中的此文字适用:

  

如果左侧操作数的提升类型为int,则只使用右侧操作数的五个最低位作为移位距离。就好像右手操作数受到带有掩码值&0x1f)的按位逻辑AND运算符0b11111§15.22.1)的影响。因此,实际使用的移动距离始终在031的范围内,包括在内。

因此,您的32位左移将转换为位的移位,即无变化。

答案 1 :(得分:1)

该值被认为是一个int,可以这样模拟:

运行3:

public static void main(String[] args) {
    System.out.println("shiftwise Example A = " + (0x47494638 << 32));

    int someNumber = 0x47494638;
    long otherNumber = someNumber << 32;

    System.out.println("shiftwise Example B = " + otherNumber);
}

<强>输出:

  

shiftwise示例A = 1195984440
  shiftwise示例B = 1195984440