scjp 强制转换问题

wren4255 2008-04-03 02:49:57
public class wrenwren
{


public static void main(String argv[])
{
byte b = 0;
int i = 5000;
b = (byte)i;
//System.out.println(Integer.toBinaryString(i));
System.out.println(b);

}
}

结果为什么是-120呢? 5000的后8位是1000 1000 应该是-8吧?
...全文
59 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracularking 2008-04-03
  • 打赏
  • 举报
回复
取反加一的操作就是衍生自8位总表示数(256)减自身
zysmiracle 2008-04-03
  • 打赏
  • 举报
回复
5000的后8位是10001000, 就是-120
11111000才是-8

解释一下:java是用补码来表示负数的,
8 = 00001000, 那么-8的反码就是11110111,-8补码就是反码+1 = 11111000
而120是01111000,同理-120 = 10001000
wren4255 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dracularking 的回复:]
引用 5 楼 wren4255 的回复:
引用 2 楼 dracularking 的回复:
错了 10001000是136 放byte范围就是-120


为什么10001000是136 放byte范围就是-120呢??

对溢出数据的截取称为narrowing primitive conversion
高位为1的binary value在java中约定为十进制负数
转换规则为取反加一(binary operation)
136 - 256 = -120(it's a convention)


[/Quote]

不行啊,看不懂。。。。
转换规则为取反加一,那为什么用136-256呢?
dracularking 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wren4255 的回复:]
引用 2 楼 dracularking 的回复:
错了 10001000是136 放byte范围就是-120


为什么10001000是136 放byte范围就是-120呢??
[/Quote]
对溢出数据的截取称为narrowing primitive conversion
高位为1的binary value在java中约定为十进制负数
转换规则为取反加一(binary operation)
136 - 256 = -120(it's a convention)

chen09 2008-04-03
  • 打赏
  • 举报
回复
-8是 11111000。
LZ要重新学一些有符号2进制了。
wren4255 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dracularking 的回复:]
错了 10001000是136 放byte范围就是-120
[/Quote]

为什么10001000是136 放byte范围就是-120呢??
dracularking 2008-04-03
  • 打赏
  • 举报
回复
取反加一就是用
100000000 - self
yangxiao_jiang 2008-04-03
  • 打赏
  • 举报
回复
byte只有127,到那里找5000??
已经溢出了
dracularking 2008-04-03
  • 打赏
  • 举报
回复
错了 10001000是136 放byte范围就是-120
dracularking 2008-04-03
  • 打赏
  • 举报
回复
它不是截取而是以轮回的方式来取溢出数据的
byte from -128 to 127 in java

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧