黑马程序员技术交流社区

标题: 关于int和byte基本数据类型 [打印本页]

作者: joechen    时间: 2013-11-2 23:25
标题: 关于int和byte基本数据类型
为什么这样编译不可以通过
  1. class Demo
  2. {
  3. public static void main(String[] args)
  4. {
  5. byte <span style="line-height: 1.5;">a=1;</span>
复制代码
这样却可以通过
  1. class Demo
  2. {
  3. public static void main(String[] args)
  4. {
  5. int a=1;
  6. a=a+1;
  7. System.out.println(a);
  8. }
  9. }
复制代码
可能是很简单的问题,但是我不知道怎么回事,谢谢了

作者: joechen    时间: 2013-11-2 23:29
错了,是把int换成byte就不行了,提示可能会损失精度
作者: 剑魂    时间: 2013-11-2 23:42
是会丢失精度的,换成byte时,在运算中自动提升为Int型,a+1为int了,再赋给byte时丢失精度,而byte a =1 赋值中会判断1在byte范围内自动转换
作者: ixiangfeng    时间: 2013-11-2 23:43
看不懂第一段、、、、
作者: joechen    时间: 2013-11-2 23:53
剑魂 发表于 2013-11-2 23:42
是会丢失精度的,换成byte时,在运算中自动提升为Int型,a+1为int了,再赋给byte时丢失精度,而byte a =1  ...

谢谢啊,是不是a+1,a是byte型,1是int型,然后a+1就成了int型
作者: 王东    时间: 2013-11-2 23:54
1是int类型,a是byte类型,如果a+1的话,就是byte类型加上一个int类型,这样的话虚拟机会强行吧byte类型提升为int类型,会损失精度。前面加上一个强制转换符就可以了

byte a = 1;
a= (byte)a+1;
作者: 剑魂    时间: 2013-11-2 23:56
joechen 发表于 2013-11-2 23:53
谢谢啊,是不是a+1,a是byte型,1是int型,然后a+1就成了int型

恩,是的
作者: joechen    时间: 2013-11-3 00:07
王东 发表于 2013-11-2 23:54
1是int类型,a是byte类型,如果a+1的话,就是byte类型加上一个int类型,这样的话虚拟机会强行吧byte类型提 ...

这样可以
                byte a=1;
       
         a=(byte)(a+1);
作者: 王东    时间: 2013-11-3 00:09
joechen 发表于 2013-11-3 00:07
这样可以
                byte a=1;
       

恩恩,嘿嘿,忘了打括号了,不好意思美女
作者: 李复安    时间: 2013-11-3 00:11
王东 发表于 2013-11-2 23:54
1是int类型,a是byte类型,如果a+1的话,就是byte类型加上一个int类型,这样的话虚拟机会强行吧byte类型提 ...

byte a = 1;
a = (byte)(a+1);
作者: mayor125    时间: 2013-11-3 00:12


上面的例子中,将数值1赋给byte型变量a,但是由于1是一个int类型的数据,在内存中占4个字节,而byte类型占1个字节,所以做byte a = 1;操作的时候,就是将int型向byte型转换,会出现精度丢失的问题。所以编译会报错。


下面的例子中将数值1赋给int型变量a,然后a = a+1;相当于将a的值加1再赋给a,从始至终都是都是int类型,没有出现类型转换,所以编译是成功的,打印输出a的结果就是2。


作者: joechen    时间: 2013-11-3 00:23
mayor125 发表于 2013-11-3 00:12
上面的例子中,将数值1赋给byte型变量a,但是由于1是一个int类型的数据,在内存中占4个字节,而byte类型 ...

是不是在int范围内,输入的整数没有标明是byte类型,默认就是int类型的
作者: mayor125    时间: 2013-11-3 00:28
joechen 发表于 2013-11-3 00:23
是不是在int范围内,输入的整数没有标明是byte类型,默认就是int类型的

整型数值默认是int类型的,记得这个就可以了...且转自动类型转换顺序是:byte→short→int→long(按字节大小的顺序是:1→2→4→8),从小到大的顺序转换。如果反过来转换的话,就要用到强制类型转换,但也容易出现精度丢失的情况。
作者: joechen    时间: 2013-11-3 01:39
王东 发表于 2013-11-3 00:09
恩恩,嘿嘿,忘了打括号了,不好意思美女

我是男的,失望了吧:lol




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