System.out.println((byte)300) 为啥是44!!!! 怎么算出来的?? 另外下面两句中,前一句可以,而后一后不能通巡编译,为什么呢float f=023.0f;//对float f=0x23.0f;//错 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 byte 的范围是-128~127300=256+44当然是44了 为什么 System.out.println((byte)128) 的结果是-128 数字是以补码二进制表示的,300本来是十六位的int,用十六位补码表示就是0000000100101100,将其强制转换成八位补码就成00101100了,将其转换成十进制,不就是44吗?0x打头的是十六进制数,而十六进制数是没有小数的,也就是说不能带小数点的,0x23.0当然错误 128(int)->0000000010000000(16bit) -> 10000000(8bit) -> -128(byte) 看来有必要解释一下补码是怎么回事了。补码二进制使用最高位作为符号位,0表示正,1表示负,即00000001是正数,10000001是负数将十进制转换成补码的规则是这样的:先将十进制数除去符号转换成普通的二进制,其位数为总位数减一,这里的总位数就是指用多少位去表示这个数,因为最高位用来表示符号,故减去1。如16位int数转换,在这里就是15位,最高位是符号位。然后,如果是正数的话不变。如果是负数的话,所有位取反,然后最低位加1,得到的结果最高位若有进位,则去掉。最后将符号位加到最高位,就得到了补码二进制数。如-128,若转换成8位二进制是10000000,去掉最高位,剩下的是7位的0000000,取反得到1111111,最低位加1得到8位的10000000,最高位有进位,去掉进位,得到7位的0000000,把符号位放到最高位,得到8位的10000000 上面说错了,128是不能用8位表示的,它首先被转换成16位的二进制补码,流程就如我以上说的:128(int)->0000000010000000(16bit) -> 10000000(8bit) -> -128(byte) java se小程序求大神解释 请教高手们一个很菜的问题 用CMD编译完后运行时出现了问题.望高手指点一下... 有谁知道上海晟峰软件怎么样 大家帮我看看我这个程序,很急迫! jbuilder下调用dll的情形下,打包后找不到dll 谁有JDK?我的丢了,现在不好找回来 [求助]applet 怎么看不到 关于推技术,请教大家 这里人气太低了,怎么搞的 问几个土问题,可以吗? 请问org.apache.jasper.servlet.JspServlet在哪个包中?
300=256+44
当然是44了
0x打头的是十六进制数,而十六进制数是没有小数的,也就是说不能带小数点的,0x23.0当然错误
补码二进制使用最高位作为符号位,0表示正,1表示负,即00000001是正数,10000001是负数
将十进制转换成补码的规则是这样的:
先将十进制数除去符号转换成普通的二进制,其位数为总位数减一,这里的总位数就是指用多少位去表示这个数,因为最高位用来表示符号,故减去1。如16位int数转换,在这里就是15位,最高位是符号位。
然后,如果是正数的话不变。如果是负数的话,所有位取反,然后最低位加1,得到的结果最高位若有进位,则去掉。
最后将符号位加到最高位,就得到了补码二进制数。
如-128,若转换成8位二进制是10000000,去掉最高位,剩下的是7位的0000000,取反得到1111111,最低位加1得到8位的10000000,最高位有进位,去掉进位,得到7位的0000000,把符号位放到最高位,得到8位的10000000
128(int)->0000000010000000(16bit) -> 10000000(8bit) -> -128(byte)