黑马程序员技术交流社区

标题: 关于数据溢出问题 [打印本页]

作者: 呆呆呆呆孔    时间: 2015-4-28 22:15
标题: 关于数据溢出问题
1.数据溢出:
看下面程序是否有问题,如果有请指出
A:

  1.     byte b1 = 126;
  2.     System.out.println(b1);
复制代码

B:
  1. byte
  2.    b2 = 130;
  3.    System.out.println(b2);
复制代码

C:

  1.    byte b3 =300;
  2.    System.out.prinln(b3);
复制代码

A编译通过
BC编译失败,可能损失精度
byte取值范围是:-128~127;
BC都超范围了
如果对B和C分别做类型强转,那么输出结果是什么呢?

  1.         byte b2 = (byte)130;
  2.         System.out.println(b2)//-126
复制代码

130为int类型4字节32位bit
原码: 00000000 00000000 00000000 10000010       
补码::00000000 00000000 00000000 10000010       
强转为byte类型截取保留后八位
补码:10000010  最高位1,所以为负数
反码:10000001
原码:11111110   -126

   

  1.           byte b3 =300;
  2.           System.out.println(b2);//44
复制代码

300为正数,原码和补码一样,(原码,符号位和数值位组成)
原码:00000000 00000000 00000001 00101100
补码:00000000 00000000 00000001 00101100
强转为byte类型:截取保留后八位(byte一个字节)
补码:00101100   最高位为0   正数
原码:00101100   原码和补码相同,所以结果是44

作者: 李彦宏是2B    时间: 2015-4-28 22:22
异常抛出
作者: 米江波    时间: 2015-4-28 22:27
很正确    明白这个原理就行啦。。呵呵
作者: 呆呆呆呆孔    时间: 2015-4-28 22:31
米江波 发表于 2015-4-28 22:27
很正确    明白这个原理就行啦。。呵呵

刚学那会,有点绕不过来,回去问问度娘。慢慢了解了
作者: kayaking    时间: 2015-4-28 22:46
学习了!~
作者: 呆呆呆呆孔    时间: 2015-4-30 06:54
kayaking 发表于 2015-4-28 22:46
学习了!~

同样啊/////////




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2