黑马程序员技术交流社区
标题:
为什么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