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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗广伟 中级黑马   /  2013-3-24 16:12  /  2044 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

例1:
class demo
{
        public static void main(String[] args)
        {
                byte a=12;
                byte c=1;
                byte b=a+c;
                System.out.println(b);
        }
}
在这个例子中值都没超出byte范围,为什么要提示可能丧失精度,并且结果为128,改为byte b=(byte)(a+c)就没问题。难道+号会自动提升类型为int还是什么原因?
例2
class demo
{
        public static void main(String[] args)
        {
                byte a=127;
                byte c=1;
                byte b=(byte)(a+c);
                System.out.println(b);
        }
}
为什么这个结果为 -128?

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-25 07:05

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

8 个回复

倒序浏览

  1. 例1:
  2. class demo
  3. {
  4. public static void main(String[] args)
  5. {
  6. byte a=12;//12为整型常量,可以直接赋值给byte变量,前提不能超出byte范围
  7. byte c=1;
  8. byte b=a+c;//byte在参与数值运算前,会首先提升为int
  9. System.out.println(b);
  10. }
  11. }
  12. 在这个例子中值都没超出byte范围,为什么要提示可能丧失精度,并且结果为128,改为byte b=(byte)(a+c)就没问题。难道+号会自动提升类型为int还是什么原因?
  13. 例2
  14. class demo
  15. {
  16. public static void main(String[] args)
  17. {
  18. byte a=127;
  19. byte c=1;
  20. byte b=(byte)(a+c);
  21. System.out.println(b);
  22. }
  23. }
  24. 为什么这个结果为 -128?
  25. 答:你把a+c结果为一个int型的变量强转为byte
  26.    那么int会发生后八位截断赋值给int
  27.    ->运算过程参照我以前回答一个问题:
  28.    强制类型转换的问题:
  29.     http://bbs.itheima.com/thread-41354-1-1.html
复制代码

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
例一:原因你已经说啦,a+c结果为int类型的

例二:byte的范围是-128~127,a+c结果为int类型的128,你把他强制类型转换成byte类型时,溢出了

在计算机中计算是以补码来运算的,
结果是128=(0000,0000,0000,0000,0000,0000,1000,0000)二进制int类型
转换成byte类型=(1000,0000)为补码,最高位为1,表示为负数,转化成原码为-128

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
是的,两个byte类型算数运算相加结果会自动提升为int类型
回复 使用道具 举报
  1. class demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 byte a=12;
  6.                 byte c=1;
  7.                 byte b=a+c;
  8.                 System.out.println(b);
  9.         }
  10. }
复制代码
例2的问题我就不说了,他们说的很清楚了!
我说下例1中的,因为在java编译的时候虚拟机并没有把12赋值给a,和把1赋值给b,因此他并不知道a+b的值是否超过byte,因此会提升会数据类型为int,然后赋值给byte b,高位的赋值给地位当然会提示损失精度!

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 罗广伟 于 2013-3-24 18:13 编辑
张洪慊 发表于 2013-3-24 16:30

意思是低精度(byte)和高精度(double)两个值运算会自动提升为高精度(double)进行运算,如果两个低精度值(一个byte一个short)运算都会提升会int型进行运算?就是说如果都低于int就按int算,一个高于int一个低于int就按高于int的算?
回复 使用道具 举报
本帖最后由 张洪慊 于 2013-3-24 18:29 编辑
罗广伟 发表于 2013-3-24 18:12
意思是低精度(byte)和高精度(double)两个值运算会自动提升为高精度(double)进行运算,如果两个低精 ...

byte,short,char->int->long->float->double
byte,short,char之间不会自动转换
回复 使用道具 举报
张洪慊 发表于 2013-3-24 18:24
byte,short,char->int->long->float->double
byte,short,char之间不会自动转换

多谢:handshake
回复 使用道具 举报
关键字  数据类型    占用字节数       取值范围
byte    字节型        1个字节          -128-127
short  短整型          2个               -2的15次幂-2的15次幂-1
int     整型             4个字节         -2的31次幂-2的31次幂-1
long  长整型            8个字节        -2的63次幂~2的63次幂-1
float 单精度浮点型  4个字节          (这个记不太清楚了,呵呵)
double 双精度浮点型 8个字节‘

java为了保证安全,在由高向低转换时必须强制转换,否则编译错误.由高向低转会发生信息丢失,由低向高则不会.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马