A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

int  m  =  1234;
byte  b1  =  (byte)m;
则 b 的值还是 123,而 b1 的值为-46。b1 的计算方法如下:m 的值转换为二进制是10011010010,取该数字低8位的值作为b1的值,则b1的二进制值是11010010,按照机器数的规定,最高位是符号位,1 代表负数,在计算机中负数存储的是补码,则该负数的原码是 10101110,该值就是十进制的-46。

12 个回复

倒序浏览
int定义是八个八位,所以第一位肯定是0了,所以byte之后应该是正数的,而且第三行怎么出现个b呢?
回复 使用道具 举报
暴风城管 发表于 2016-3-9 19:32
int定义是八个八位,所以第一位肯定是0了,所以byte之后应该是正数的,而且第三行怎么出现个b呢? ...

“则b的值还是123“这是多余的,而且说得清清楚楚byte之b1=-46你咋又整出个正数了呢?
回复 使用道具 举报
因为我还不是很懂这些,所以就是说int型1234在byte以后就是-46?是正确的是吗?我也感觉很奇怪
回复 使用道具 举报
b是什么...程序里也没有b啊
回复 使用道具 举报
暴风城管 发表于 2016-3-9 19:57
因为我还不是很懂这些,所以就是说int型1234在byte以后就是-46?是正确的是吗?我也感觉很奇怪 ...

  11010010
- 00000001
   ----------
  11010001
    取反
   00101110     ←这是我按照负数的二进制运算得出来其对应的正数二进制码,我想问10101110是怎么来的
32+8+4+2=46
回复 使用道具 举报
猜猜我是谁 发表于 2016-3-9 20:06
b是什么...程序里也没有b啊

之前网页上查Java数据转换的时候多复制了的内容,也没法改了,忽略即可
回复 使用道具 举报
本帖最后由 yanzhendong 于 2016-3-9 21:58 编辑

额,先将补码转换成反码,再将反码转换成原码,补码转反码是补码减1,包含符号位,反码转原码是各位取反不包含符号位,则,11010010(补码)转换成反码是11010001(反码),再转换成原码就是10101110

回复 使用道具 举报
yanzhendong 发表于 2016-3-9 21:38
额,先将补码转换成反码,再将反码转换成原码,补码转反码是补码减1,包含符号位,反码转原码是各位取反不 ...

又在网上去搜了一下,原来负数的二进制取反的时候要保持高位不变,谢了!
回复 使用道具 举报
顶贴,求大神
回复 使用道具 举报
CangYe 发表于 2016-3-9 20:39
之前网页上查Java数据转换的时候多复制了的内容,也没法改了,忽略即可

int类型在内存中占用四个字节,每个字节是八位,也就是32位,而byte类型在内存中只占用一个字节,也就是说byte只有八位,你将int型强制转换成byte型,byte类型本身所占的存储空间是装不下的,会自动截取一部分,只保留了后八位,也就是int型的最后一个字节100 11010010中的11010010,前面三位有效位100会被舍弃,得到二进制数11010010。而在程序运行过程中所有运算均采用的是补码形式,原码、反码和补码的最高位表示的是该数的正负,0为正1为负,11010010的第一位为1,则为负数,负数的原反补关系为:原码除去最高位以外均取反可得到反码,也就是1变0,0变1;反码+1得到补码;现在逆推,反码:11010010-00000001=11010001,则原码为10101110,第一位为1,则为负数,后七位0101110对应十进制数为46,则最终b1 = -46
回复 使用道具 举报
int在内存中占四个字节,1234的二进制是 100 1101 0010(正数原,反,补一样),而byte占一个字节,byte  b1  =  (byte)m强转,砍掉前面24位,是1101 0010(补码),最高位是符号位,1代表是负数,补码转原码是1110 1110得-46.
回复 使用道具 举报
好好学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马