Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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/asp.net-mvc-3/4.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_Char_Byte_Bit Manipulation_Bit - Fatal编程技术网

为什么JAVA中的按位和带字节会这样做?

为什么JAVA中的按位和带字节会这样做?,java,char,byte,bit-manipulation,bit,Java,Char,Byte,Bit Manipulation,Bit,我在摆弄逐位运算符,我试图将负字节转换为无符号8位值,这是人们建议的: System.out.println(-20 & 0xFF); //bitwise AND on negative number and 255 所以,这是完美的,返回236,但是为什么呢?就我而言: 00010100 //binary representation of -20 11111111 //binary representation of 0xFF or 255 -------- 00010100 /

我在摆弄逐位运算符,我试图将负字节转换为无符号8位值,这是人们建议的:

System.out.println(-20 & 0xFF); //bitwise AND on negative number and 255 
所以,这是完美的,返回236,但是为什么呢?就我而言:

00010100 //binary representation of -20
11111111 //binary representation of 0xFF or 255
--------
00010100 //it returns the same exact thing, so it's either -20 or 20
它为什么有效?我想我错过了一些非常简单的东西,但我似乎无法理解


同样,如果我用一个低于256的正数来做,它返回相同的数。我似乎无法理解Java如何处理这些数字

字节是8位的有符号值,可能在-128到127之间

最左边的位用作符号位

System.out.println-20和0xFF;与字节无关,这是一个int操作

-20的二进制表示形式为:1110_1100

1110_1100&1111_1111=1110_1100

如果你想不签名,可以玩char,但你不会高兴的。实际上,Java没有未签名

底片以“2s补码”形式存储,例如:

1111_1111==-1

但是为什么呢

在2s补码下生成负数,所有位翻转1s补码,1相加生成2s补码-两次运算

所以


字节是8位的有符号值,可以在-128到127之间

最左边的位用作符号位

System.out.println-20和0xFF;与字节无关,这是一个int操作

-20的二进制表示形式为:1110_1100

1110_1100&1111_1111=1110_1100

如果你想不签名,可以玩char,但你不会高兴的。实际上,Java没有未签名

底片以“2s补码”形式存储,例如:

1111_1111==-1

但是为什么呢

在2s补码下生成负数,所有位翻转1s补码,1相加生成2s补码-两次运算

所以


Java中的文本是int的形式。因此,当您说-20&0xFF时,会发生以下情况:

  11111111 11111111 11111111 11101100 //-20 -ve nos are stored in 2's compliment form
& 00000000 00000000 00000000 11111111 // 0xFF 
  -------- -------- -------- --------
  00000000 00000000 00000000 11101100 // 236
由于负值以2的恭维形式存储,因此得到值236

执行20&0xFF时,会发生以下情况:

  00000000 00000000 00000000 00010100 // 20 -ve nos are stored in 2's compliment form
& 00000000 00000000 00000000 11111111 // 0xFF 
  -------- -------- -------- --------
  00000000 00000000 00000000 00010100 // 20

Java中的文本是int的形式。因此,当您说-20&0xFF时,会发生以下情况:

  11111111 11111111 11111111 11101100 //-20 -ve nos are stored in 2's compliment form
& 00000000 00000000 00000000 11111111 // 0xFF 
  -------- -------- -------- --------
  00000000 00000000 00000000 11101100 // 236
由于负值以2的恭维形式存储,因此得到值236

执行20&0xFF时,会发生以下情况:

  00000000 00000000 00000000 00010100 // 20 -ve nos are stored in 2's compliment form
& 00000000 00000000 00000000 11111111 // 0xFF 
  -------- -------- -------- --------
  00000000 00000000 00000000 00010100 // 20

-20 != 20,所以表示也不一样。-20!=20,所以表示形式也不一样,我说byte是因为我试着把-20存储在一个字节中,然后做&0xFF的事情,结果成功了。还有,11101100,不是-108吗?最左边的一位代表负数,其余的代表实际数字,即108。这里我缺少什么?只有两个地方缺少unsigned真正需要您额外注意:关系运算符和加宽转换。切换到char通常是愚蠢的,因为几乎对它的任何操作都会导致一个int,返回所有gorry签名的问题,但现在隐藏在中间结果中。了解twos补码的详细信息可以让您正确地处理无符号数据,即使变量被视为有符号数据。没有足够的知识可以替代,java或任何其他语言都不行。我只是开始关注数据类型的大小以及它们是有符号的还是无符号的等等。我总是盲目地使用int或long来表示数字,但现在我正在处理一些需要更深入地理解数据类型的事情,这就是为什么我要问这个问题。@Durandal他在试验bits,而不是设计核电站控制系统。没有“愚蠢”,只有学习。是的,对那些撞毁阿丽亚娜5号火箭的程序员来说也是如此,因为他们懒得用变窄的投射来处理溢出。我猜他们也只是在玩些小玩意儿。我把给char一个建议开关称为“愚蠢”,它会带来比解决问题更多的麻烦。只是我的意见。我说byte是因为我尝试将-20存储在一个字节中,然后执行&0xFF操作,它确实起了作用。还有,11101100,不是-108吗?最左边的一位代表负数,其余的代表实际数字,即108。这里我缺少什么?只有两个地方缺少unsigned真正需要您额外注意:关系运算符和加宽转换。切换到char通常是愚蠢的,因为几乎对它的任何操作都会导致一个int,返回所有gorry签名的问题,但现在隐藏在中间结果中。了解twos补码的详细信息可以让您正确地处理无符号数据,即使变量被视为有符号数据。在java或任何其他语言中都没有足够的知识替代品
数据类型的大小以及它们是有符号的还是无符号的等等。我总是盲目地使用int或long来表示数字,但现在我正在处理一些需要更深入理解数据类型的事情,这就是为什么我要问这个问题。@Durandal他是在用bits做实验,而不是设计核电站控制系统。没有“愚蠢”,只有学习。是的,对那些撞毁阿丽亚娜5号火箭的程序员来说也是如此,因为他们懒得用变窄的投射来处理溢出。我猜他们也只是在玩些小玩意儿。我把给char一个建议开关称为“愚蠢”,它会带来比解决问题更多的麻烦。只是我的意见。啊,我现在明白了。可能是2的赞美形式让我困惑。让我直截了当地说:如果我保存一个介于-128和-1之间的负数,它将被保存为256减去该数字的7位表示,第8位仅用于表示它是负数还是正数,对吗?现在,唯一让我有点困惑的是,在第一个例子中,24个1被附加在-20的开头。为什么是1,为什么不是0?这是目前唯一困扰我的事情。@user1007059:如果您有一个字节变量,那么第8位用于存储符号。但是当您有一个文本时,就像上面的例子一样,文本被存储为int,不管大小有多小。因此,当您写入-20&0xFF时,将创建两个分别为32位的整数,并且MSB(即第32位)用于存储符号。在第一个例子中,前面的1是存在的,因为数字是2的恭维形式,在2的恭维形式中,第一个1之前的所有位都被翻转,即0变为1,1变为0。好的,谢谢,我现在了解了大部分内容。我可以继续胡乱摆弄比特和字节,而不会觉得自己像个白痴:啊,我现在明白了。可能是2的赞美形式让我困惑。让我直截了当地说:如果我保存一个介于-128和-1之间的负数,它将被保存为256减去该数字的7位表示,第8位仅用于表示它是负数还是正数,对吗?现在,唯一让我有点困惑的是,在第一个例子中,24个1被附加在-20的开头。为什么是1,为什么不是0?这是目前唯一困扰我的事情。@user1007059:如果您有一个字节变量,那么第8位用于存储符号。但是当您有一个文本时,就像上面的例子一样,文本被存储为int,不管大小有多小。因此,当您写入-20&0xFF时,将创建两个分别为32位的整数,并且MSB(即第32位)用于存储符号。在第一个例子中,前面的1是存在的,因为数字是2的恭维形式,在2的恭维形式中,第一个1之前的所有位都被翻转,即0变为1,1变为0。好的,谢谢,我现在了解了大部分内容。我可以继续胡乱摆弄比特和字节,而不会觉得自己像个白痴:D