黑马程序员技术交流社区

标题: 在Java中,两个byte类型数据相加为什么会报错呢? [打印本页]

作者: 仲德明    时间: 2015-5-31 19:04
标题: 在Java中,两个byte类型数据相加为什么会报错呢?
在Java中,两个byte类型数据相加为什么会报错呢?
byte b=4;
byte b1=3;
byte b2=7;
b=b1+b2;      //这样是计算不出b,是错误的
b=b1+7;        //这样也是计算不出b
byte b=3+7;  //怎么这样又可以计算?
//b = 3+7;
  /*
  b取值范围:-128~127
  编译器在编译时(byte类型取值是有限的)他在判断右边的数值的时候发现是int类型(是“常量”), 但他
  会判断是不是在byte字节范围之内,如果在的话,会给右边的int类型做默认的强转,他把最后
  的一个字节(byte八个二进制)赋值到了b这个变量当中
  */

/*
  b1和b2是“变量”意味着这两值不确定、可能随时变化,编译器无法检查,也无法确定
  是否在byte字节范围之内, 他检查不了就会报错(可能丢失精度),如果是“常量”编译器就能够判断了

  int x;
  int x1=Integer.MAX_VALUE;
  int x2=2;
  x=x1+x2;
  默认int运算,一旦超出这个范围,他自动底层有强制转换过程,保留自己原有位置、高位全舍弃
  这就是byte和int的区别,int属于默认类型,他就没有byte上面那样的问题
  */
  
  //byte和short类型“变量”,相加不能确定结果,无法检查,也不是默认类型,
    所以byte、short类型相加的时候,都会自动提升到int类型的

byte 表示一个字节,他的表示范围[-128 127],
byte b=4;
byte b1=3;
byte b2=7;  都在这个范围之内,没有问题。
这里还有一个问题 就是我们写的整数,没有明确指出类型(比如说 byte b = 4;中的4) 系统默认是int的,
   那么为什么不会编译出错呢,这里( 我认为 )这个整数如果没有超出范围(比如 byte b = 4;在范围之内),
   编译系统有个自动转换。
   那么b= b1 + b2;怎么又会编译出错呢,而且 b1,b2都是byte型的,这里java又有自己的一个
   机制,就是防止两个小数相加超出自己所表示的范围,把b1 ,b2变成 int 在相加。相加后
   也是int 型(注意这里的int 和 上面说的没有指出类型的整数默认是int 有区别,这里相当
   于你自己实际定义的了 例 int c=0;系统不会在将这种明确规定数据类型的数做出自动转换的。
   转换也要自己强制类型转换b=byte(b1+b2);   这样看来好像更符合防止两个数相加超出自己表示范围的机制)。
   b=b1+7;和b= b1 + b2;情况差不多。
   byte b=3+7;这个就好理解了,编译器是把 3+7 看作一个整体的 就是10 了,10




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