Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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 为什么3>>32等于3?_Java_Node.js_Bitwise Operators_Bit Shift - Fatal编程技术网

Java 为什么3>>32等于3?

Java 为什么3>>32等于3?,java,node.js,bitwise-operators,bit-shift,Java,Node.js,Bitwise Operators,Bit Shift,为什么3右移32等于3而不是0 我在nodeJs和Java中得到了这些结果 3 >> 31 = 0 3 >> 32 = 3 3 >> 33 = 1 3 >> 34 = 0 3 >> 35 = 0 这是Java语言规范的一部分。对右侧操作数进行包装,使其始终在0位范围内,其中位是左侧操作数的位数。由于要移位32位整数,因此右侧操作数将在0到31之间换行。32变为0,33变为1等 见: 如果左侧操作数的提升类型为int,则仅将右侧操作数的五个最低阶位用作移位距离。这就好像右侧操作数接受位逻辑AND运

为什么3右移32等于3而不是0

我在nodeJs和Java中得到了这些结果

3 >> 31 = 0 3 >> 32 = 3 3 >> 33 = 1 3 >> 34 = 0 3 >> 35 = 0
这是Java语言规范的一部分。对右侧操作数进行包装,使其始终在0位范围内,其中位是左侧操作数的位数。由于要移位32位整数,因此右侧操作数将在0到31之间换行。32变为0,33变为1等

见:

如果左侧操作数的提升类型为int,则仅将右侧操作数的五个最低阶位用作移位距离。这就好像右侧操作数接受位逻辑AND运算符&§15.22.1,掩码值为0x1f 0b11111。因此,实际使用的移动距离始终在0到31之间(包括0到31)


这是Java语言规范的一部分。对右侧操作数进行包装,使其始终在0位范围内,其中位是左侧操作数的位数。由于要移位32位整数,因此右侧操作数将在0到31之间换行。32变为0,33变为1等

见:

如果左侧操作数的提升类型为int,则仅将右侧操作数的五个最低阶位用作移位距离。这就好像右侧操作数接受位逻辑AND运算符&§15.22.1,掩码值为0x1f 0b11111。因此,实际使用的移动距离始终在0到31之间(包括0到31)


C++不是NoDEJS和java。这是未定义的行为。没有移位值的运行时检查,并且移位大于32的值取决于处理器行为。所以对于语言来说,它是未定义的行为。最可能的情况是,指令字段中只有5位用于指定移位,并且只保留移位值的5 LSB。所以>>32相当于>>0,>>33相当于>>1,依此类推。向左移位的情况也一样,看起来像是循环移位:int32的长度是32。对于大于或等于32的移位,会发生类似的情况:val>>移位%32。对于32,它将是0和3>0=3,33的移位将是33% 32=1~3 3>1=1。C++不是NoDEJS和java。这是未定义的行为。没有移位值的运行时检查,并且移位大于一个值,取决于处理器行为。所以对于语言来说,它是未定义的行为。最可能的情况是,指令字段中只有5位用于指定移位,并且只保留移位值的5 LSB。所以>>32相当于>>0,>>33相当于>>1,依此类推。向左移位的情况也一样,看起来像是循环移位:int32的长度是32。对于大于或等于32的移位,会发生类似的情况:val>>移位%32。对于32,它将是0和3>>0=3,对于33,移位将是33%32=1->3>>1=1。