本帖最后由 NewDemo 于 2014-4-21 15:19 编辑
x =x +(byte)(1) 你这样写的不叫类型转,写法只能是这样的x=(byte)(x+1)
- byte a = 1;
- byte b =1;
- byte x = 66;
- byte y = 90;
- byte c =a +b;//byte类型做 +-*/都会丢失精度,即使都是byte类型都不行 这句话编译不会通过
- System.out.println(a+b);//系统进行了强转动作 所以编译可以通过,结果是2
- System.out.println(x+y);//系统进行了强转操作,所以结果是156
- System.out.println((byte)(x+y));//因为byte的取值范围是-128~127,所以这样的强转就会出现-100的结果
- System.out.println((int)(a+b));//这里将类型提升后结果就是156
- a+=b;//这句话会自动进行类型提升,所以打印a的结果同样是156
- System.out.println(a);
复制代码
下面引用别人的一些经典回答
提升为int,在进行相加。我们下看下边代码:- class Test
- {
- public static void main(String[] args)
- {
- byte a=1,b=1;
- byte c =a+b;
- System.out.println(c);
- }
- }
[color=rgb(177, 8, 0) !important]复制代码
编译时就会提示损失精度,需要byte,找到int。
如果是先相加得到结果再提升,此时a+b=2,没有超出byte类型,按理说不应该自动提升数据类型了,但是结果还是提升了。
由此可见,先相加得到结果再提升数据类型 不成立。
另外,提一点,楼主代码中,System.out.println((int)(a+b));结果之所以是-100,是因为楼主采用的是中问字符的括号,因此编译时提示异常,并显示-100,正常情况下,结果仍然是156.
只有在把这个结果强转回byte型时,才会得出-100.
原因是,计算结果是计算结果是int型,是32位,而byte最高只有8位,8为存储的正数最高是127(0111 111),因此存储不下计算结果。
强制转换时会把int型156(0000 0000 0000 0000 0000 0000 1001 1100)的前24位全部忽略掉,变为1001 1100,对应十进制-100.
|