黑马程序员技术交流社区

标题: 为什么byte类型的-1 与上255后变成了正数 [打印本页]

作者: Unknown_Explore    时间: 2016-7-22 23:49
标题: 为什么byte类型的-1 与上255后变成了正数
如题所示。求答

作者: suncool    时间: 2016-7-22 23:49
b&255 (0000 0000  0000 0000  0000 0000) 1111 1111          0000 0000  0000 0000  0000 0001  1111 1111  -->255 b与上255的时候,有如上的过程,btye和int运算,byte会自动转换为int类型,前面补上一堆0,然后0&1=0  所以结果是1111 1111  与原来的byte的-1  的结果1111  1111  byte值一样,但是代表的值不一样  因为一个是int类型 一个是byte类型的,btye类型的1111 1111是-1  而int类型的1111 1111 是255  所以从-1变成了正数
作者: 汐城西下    时间: 2016-7-23 00:08
这里与是位运算符&

0的二进制是11111111 11111111 11111111 11111111 ,255的二进制是00000000 00000000 00000000 ‭11111111‬,在位运算中0代表false,1代表true,通过计算二进制依旧是00000000 00000000 00000000 ‭11111111,所以结果为255,依旧是正数‬
作者: miqideliwu    时间: 2016-7-23 01:10
byte 类型的取值范围 -128~127占1个字节,byte -1 二进制为10000001
255为int类型占4个字节,二进制为 00000000 00000000 00000000 11111111
二者相与时byte 类型提升为int 类型00000000 00000000 00000000 10000001
相与后的结果为00000000 00000000 00000000 10000001故为正数129
        
作者: 一声娇喘卿已乱    时间: 2016-7-23 16:12
因为有正数和负数,正数是前127,负数是128到255。
作者: zhu21925    时间: 2016-7-23 23:23
byte 是一个字节,-1的二进制位补码是11111110 , 255是int类型数据,有4个字节,二进制数为00000000  00000000  00000000 01111111.   运算是byte自动提升为int类型所以前面要加三个字节,如下:
   00000000  0000000 00000000  11111111
&00000000  0000000 00000000  01111111
   00000000  0000000 00000000  01111111 = 255。有0则0,两个为1就是1。所以结果是255.
作者: 生牛排    时间: 2016-7-23 23:28
计算机都是以二进制的补码存储的,超过了范围的默认转换为int类型的四个字节,然后再截取最后一个字节的二进制进行换算,具体的实现楼下已经说了
作者: sun3783    时间: 2016-7-24 09:56
byte类型与int型运算存在类型提升,会将byte类型提升,也就是高位补0,将一个字节扩充到4个字节,也就是00000000 00000000 00000000 11111111 高位由1变成0了,所以就由负数-1变成了正数255.这个等你学到字符流读取的时候,就会发现这样处理带来的好处。
作者: shockzwel1    时间: 2016-7-24 23:24
很多人都说出了正解  版主为什么不宣布已解决???
作者: hushaojie@0719    时间: 2016-7-27 23:00
自动类型提升
作者: 13411939415    时间: 2016-7-28 10:26
我来解释一下吧,附运算全过程。
1:或运算是用补码来进行的运算,运算的结果为答案的补码,再转换成原码就是最终答案。
2:byte类型的-1与int类型的255进行运算时,-1会自动提升为int类型。
下面是运算步骤:
首先是 -1 的原码: 10000000  00000000  00000000  00000001 (最高为为符号位,负号为1);
          -1 的反码: 11111111  11111111  11111111  11111110 (除了符号位,其他位置全部取反);
          -1 的补码: 11111111  11111111  11111111  11111111 (反码的基础上加1);
255为正数,原码、反码、补码均为自身:
        255 的补码: 00000000  00000000  00000000  11111111
所以-1 & 255的结果为:
                           00000000  00000000  00000000  11111111(最终答案的补码)
由于结果最高位为1,即结果为正数,转换成原码后不变:
                           00000000  00000000  00000000  11111111 (最终结果)
因此最终结果是:  -1 & 255 = 255

好像已经够全面了,希望你能看得明白
作者: huangzhaoqing    时间: 2016-7-28 23:57
去把基础视频前面有关原饭补码看一遍吧。  以后遇到这种问题就都懂了。  我看的刘意老师的视频上有讲。
作者: Unknown_Explore    时间: 2016-7-29 22:30
谢谢大家。不过这个比较符合我想要的答案。其他人都很好。我就挑个对的上眼的咯
作者: 王清术    时间: 2016-7-30 22:49
把它化为补码后计算再化为原码就知道了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2