黑马程序员技术交流社区
标题:
求高手解题
[打印本页]
作者:
汪洋大海
时间:
2013-12-29 01:30
标题:
求高手解题
class Demo
{
public static void main(String[] args)
{
int a = 255;
System.out.println((int)(byte)a);
}
}
复制代码
打印的结果为什么会是-1?
作者:
DOOR
时间:
2013-12-29 01:53
本帖最后由 DOOR 于 2013-12-29 02:01 编辑
int型是32位
byte型是8位的
int a=255;
a的存储是这样的:00000000 00000000 00000000 11111111
强转成byte需要强制截去前面多余的24位,
所以 (byte)a的存储是这样的:11111111
对应的值就是-1
然后再强转成int32位,前面补0还是1需要根据被转化的最高位来进行补位也就是这里的1
那么(int)(byte)a的存储是这样的:11111111 11111111 11111111 11111111
所以最终还是-1
作者:
wyf880204
时间:
2013-12-29 02:02
System.out.println((int)(byte)a); 其实就是这样的 System.out.println((byte)a); 你那个在装进int里 能撑下
byte 是-128到127 下一个循环是256个值 256-127=129 对应-128--127 掐指一算就是-1呀
作者:
工善器
时间:
2013-12-29 11:41
说byte占一个字节没错,但是一般人都只知其一不知其二,1byte等于8bit(位)如果这8位都用于表示整数那能表示0-255的任意数,但是byte类型即可以表示正整数也可以表示负整数,所以第1位是符号位(用于表示正数还是负数)剩下7位用于表示整数,因此只能表示-128-127,255是一个字面量(就是直接写的一个整数)默认类型是int,现在要将一个int类型(4个字节,也就是32位)强制转换为byte类型(1个字节,也就是8位)肯定要丢失一些精度,因为int大,byte小,只能将int数的后8位保留下来,赋值给byte类型的变量
255的二进制是00000000000000000000000011111111,截取成byte类型只保留后
8位,也就是11111111,第1位是符号位0代表正数、1代表负数,这里第一位是1也就是负数,计算机存储的负数是补码,必须将其他位取反(变成全零)再加1,取反加1后这个数为-00000001,这个二进制数转换为整数是-1。所以结果为-1
作者:
工善器
时间:
2013-12-29 11:42
哥们这种形式的代码是怎么从编辑器粘过来的?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2