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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 爱翚 中级黑马   /  2014-4-20 23:07  /  1057 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 爱翚 于 2014-4-23 10:03 编辑

public static void main(String[] args) {
  byte num = 3;
  num = (byte) (num + 2);//这个写法没什么可说的
  num = num + (byte)2;//为什么这种写法是错误的?
  System.out.println(num);
}

这里为什么就不能把int型的2先转换为byte型的2再相加?

麻烦给我指点一下,谢谢。

评分

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

查看全部评分

12 个回复

倒序浏览
num + (byte)2  结果 会自动转成 int 类型的 , 大的类型 int 不能自动转换成 小的类型byte  必须强制转换!
回复 使用道具 举报
老师的视频你要好好的看看了,这个问题不难理解
num = num + (byte)2;
首先你要知道系统默认的都是int型  2是一个int型常量是不能被byte强转的
只有变量就是 x,y啊这样的才可以强转..
而且注意强转的时候注意要在强转类型的取值范围之内,否则会丢失精度

评分

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

查看全部评分

回复 使用道具 举报
num是byte型的
我这么写的目的就是先把int型的2强制类型转换成byte型,然后再进行两个byte型的数值相加

我的疑问是为什么(byte)2会起不到强制类型转换的作用?
回复 使用道具 举报
本帖最后由 anqi 于 2014-4-20 23:33 编辑

你明白原理就知道了
2是一个数字,他不是变量指向的,int类型占32位怎么能放到8位的空间内?
不要认为2在内存为10,占2个位置, 它是32位的,虽然前面30位是0,但整个32位才能代表这个int类型 的2
为什么变量能放进去呢。因为变量是单独一个空间,它的方法是取后面8位然后放入,它也不是硬塞。如果换成long类型的就可以
public static void main(String[] args) {
long num = 3;
  num = num + (long)2;//这种写法就不报错,因为把16位的放入32位就可行
  System.out.println(num);
}


评分

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

查看全部评分

回复 使用道具 举报
悠然丶 发表于 2014-4-20 23:16
老师的视频你要好好的看看了,这个问题不难理解
num = num + (byte)2;
首先你要知道系统默认的都是int型   ...

实在不好意思,您回答的我没太看懂
首先精度会丢失这个视频里讲过了,我很清楚

如果按照您说的强制转换只能对变量进行转换的话,那我下面的这两种写法应该会报错才对
num = (byte)'1';
num = (byte)2;


public static void main(String[] args) {
byte num = 3;
        num = (byte) (num + 2);
        num = num + (byte)2;//为什么只有这个报错
        num = 5;
        num = (byte)'1';
        num = (byte)2;
        System.out.println(num);
}
回复 使用道具 举报
anqi 中级黑马 2014-4-20 23:45:38
7#
爱翚 发表于 2014-4-20 23:40
实在不好意思,您回答的我没太看懂
首先精度会丢失这个视频里讲过了,我很清楚

num = num + (byte)2;//为什么只有这个报错 看我上面写的
        num = 5;
        num = (byte)'1';//num是在栈内存分配的一片空间 这个方法的意思就把16位的char或者int取最后8位放入inum空间
        num = (byte)2;
回复 使用道具 举报
爱翚 中级黑马 2014-4-20 23:50:59
8#
anqi 发表于 2014-4-20 23:29
你明白原理就知道了
2是一个数字,他不是变量指向的,int类型占32位怎么能放到8位的空间内?
不要认为2在内 ...

您好,我是今天看老师的视频时产生的疑问

下面三种写法,前两种都不报错,唯独第三种报错
我想问一下第二种写法和第三种写法中的(byte)3的区别在哪?
//写法一
byte a = 3;
//写法二
byte b = (byte)3;
//写法三
byte num = 3;
num = num + (byte)2;
回复 使用道具 举报
anqi 中级黑马 2014-4-21 00:03:10
9#
本帖最后由 anqi 于 2014-4-21 00:06 编辑

你要明白变量和数值的不同啊你别老想着大小这个3,换成10000远远大于byte能表示的。
byte b = (byte)10000; 这个过程就是把10000的2进制表示形式的后8为放到b指向的内存。中是个转换过程
这个过会丢失精度,但强转的意思是我知道可能丢失精度,但我仍要这么做。
num = num + (byte)10000; 先运算的是(byte)10000,你能把10000放到byte中吗?它没有变量的指向,编译器
肯定不会允许你把32位的放进8位的空间中。只有在赋值给变量的时候才有那种把32位的空间取8位。

评分

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

查看全部评分

回复 使用道具 举报
谢谢各位的回答。
我今天刚刚看的视频,byte、short、int、long都占多少位老师讲了,而且高位硬性向低位数据转换会造成精度丢失老师也讲了。

我现在的理解是(byte)2运算后的数值型还是int,并没有被强制转换过来。
这才导致了num = num + (byte)2;执行的结果还是将一个int型的数值付给了一个byte型的变量,导致报错了。

简单点说就是(byte)2并没有达到强制类型转换的目的。

不知道我这样的理解对不对?

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 问题问的很好

查看全部评分

回复 使用道具 举报
anqi 发表于 2014-4-21 00:03
你要明白变量和数值的不同啊你别老想着大小这个3,换成10000远远大于byte能表示的。
byte b = (byte)10000; ...

谢谢您啊.
回复 使用道具 举报
本帖最后由 ily521125 于 2014-4-21 00:31 编辑
爱翚 发表于 2014-4-21 00:05
谢谢各位的回答。
我今天刚刚看的视频,byte、short、int、long都占多少位老师讲了,而且高位硬性向低位数 ...


1.  使用2目运算符的运算中,低于int型的都会转成int运算,高于int型的会转成最高的那个类型运算
2.  使用3目运算符时,相对低级的数值会提升
也就是说
      byte num = 3;
      byte num = num +(byte)2; //错误,其中的num和2都是byte类型的,但是他们进行了相加运算就变成了int类型,因此num + (byte)2还是一个int类型的数据,是不能赋值给byte类型的num的。

      byte num = (byte)(num+2);//正确,其中num会自动转换为int类型与2相加,因此num+2是int类型的,加上byte后就变成了byte类型了。
再给你举个例子:
      byte a=1;
      byte b=2;
      byte c = a+b;//错误,这里还是会出错,因为就算你都定义了a、b为byte类型,但是相加后就会变成int类型,因此你要加上byte强制转换
      byte d = (byte)(a+b);//正确
      


回复 使用道具 举报
ily521125 发表于 2014-4-21 00:18
1.  使用2目运算符的运算中,低于int型的都会转成int运算,高于int型的会转成最高的那个类型运算
2.  使 ...

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