2017-07-03 68 views
-3

int z = -1; int m = z>>1; System.out.println("the values is " +m);向右移位运算功能

输出是 the values is -1

,但我的疑问是它内部是如何发生的,任何能解释一下吗?一步一步程序。

int z = 2; int m = z >> 1;

在二进制

00000000 00000000 00000000 00000010 z值,

的值被移位然后经过二进制M值将作为

00000000 00000000 00000000 00000001,当我打印m值将它作为1,但我的问题是,如果我为z变量使用负值,并且为z赋值-1,为什么输出变量本身具有-1,会发生什么? (两者相辅相成,会发生不?)

+2

你是指内部发生了什么?右移运算符在[JLS](http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19)中有解释。你不明白的是什么? – RealSkeptic

+0

请求“一步一步”的任何事情通常都是要求写入规范的新完整教程。这感觉就像你根本没有做任何工作,并要求别人做很多志愿者的努力。关于Stack Overflow的一个很好的提示是为了表明你已经做出了很好的努力,如果你不能在一个问题中表明这一点,那么首先要做更多的努力。 – halfer

回答

0

如上所述in JLS Sec 15.19

n >> s值是n右移s位有符号扩展位。结果值为floor(n/2^s)

所以,你计算-1 >> 1 == floor(-1/2) == floor(-0.5) = -1

+0

'int z = 2; int m = z >> 1;'二进制中的z值000000000000000000000000000000',当值被移动后,二进制中的m值将为00000000000000000000000000000001,当我打印m值时它将是作为'1',但我的问题是,如果我为'z'变量使用负值,并且当我使用'-1'分配'z'值,为什么输出变量本身具有'-1'会发生什么? (两个补码会发生不是吗?) – Prakash

+0

@Prakash你应该阅读https://en.m.wikipedia.org/wiki/Arithmetic_shift#Non-equivalence_of_arithmetic_right_shift_and_division,因为它描述了这个特定的情况(尽管在8位)。 –