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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马嗨嗨嗨 高级黑马   /  2016-11-13 09:56  /  3990 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
本帖最后由 黑马嗨嗨嗨 于 2016-11-13 09:54 编辑

在看视频的时候产生的一些疑惑。。
[AppleScript] 纯文本查看 复制代码
class Text
{
        public static void main (String[] args)
        {
                byte b = 4;
                byte b1 = 3;
                byte b2 = 7;
                b = b1 + b2;
                System.out.println(b);
        }
}
//在进行byte变量计算时,会报错,视频所讲是因为变量数值是变化的,有可能会超出byte的范围所以报错
//但当我‘b = (byte)(b1 + b2); 将变量计算强制类型转换成byte类型计算时,却可以计算

猜想

其实byte不能进行变量计算,其实是因为系统将变量运算直接默认自动提升为int类型计算!!!超出了byte的承载范围,所以报错!!!(而并不是变量是不确定的值,可能会超出byte承载范围而报错


发现
[AppleScript] 纯文本查看 复制代码
class Text
{
        public static void main (String[] args)
        {
                long b = 2147483647;
                System.out.println(b);
        }
}

//当我直接‘long b = 2147483647’是可以直接显示的,int类型的上限值是:2147483647。。。
//但当我 long b = 2147483648;却不能直接显示(超出了int类型上限值),必须在后面加‘l’, long b = 2147483648l;才能显示
//
猜想

int默认类型,其实就是将里面的:数值、计算结果数值,都约束在int类型范围内,如果数值超出int类型范围,则必须进行标识!!!


求助:我的猜想是不是对的? 是视频上讲的有问题,还是我的猜想出了错?


QQ截图20161113085424.png (5.38 KB, 下载次数: 70)

QQ截图20161113085424.png

QQ截图20161113090600.png (7.45 KB, 下载次数: 61)

QQ截图20161113090600.png

QQ截图20161113095028.png (1.46 KB, 下载次数: 69)

QQ截图20161113095028.png

最佳答案

查看完整内容

操作运算默认int类型,你定义byte不是你超出范围,而是int到byts从大到小,因为占用字节不同int 4个字节非要转成2个字节可能会损失精度,但是强转了所以不报错,你定义long范围不报错在int范围不报错,但是超过范围你不加强转,不会损失精度吗?你想法不能纠结范围内,你要考虑字节大小。再说2147483648l不是标识而是代表的是强制类型转换。 ...

8 个回复

倒序浏览
操作运算默认int类型,你定义byte不是你超出范围,而是int到byts从大到小,因为占用字节不同int 4个字节非要转成2个字节可能会损失精度,但是强转了所以不报错,你定义long范围不报错在int范围不报错,但是超过范围你不加强转,不会损失精度吗?你想法不能纠结范围内,你要考虑字节大小。再说2147483648l不是标识而是代表的是强制类型转换。
回复 使用道具 举报
不是说是字节数的问题吗?int的字节数多byte的少强转会丢字节就像是四舍五入是的~转完了就舍去了再也找不到原来的数字了,
回复 使用道具 举报
浪弦丶 发表于 2016-11-13 11:30
操作运算默认int类型,你定义byte不是你超出范围,而是int到byts从大到小,因为占用字节不同int 4个字节非 ...

2147483648l不是标识而是代表的是强制类型转换,哦,其实这就是可以看做是强制转换成  
(long)2147483648  让虚拟机识别出来对吧。
回复 使用道具 举报
黑马嗨嗨嗨 发表于 2016-11-13 12:01
2147483648l不是标识而是代表的是强制类型转换,哦,其实这就是可以看做是强制转换成  
(long)21474836 ...

是的int 强转long类型
回复 使用道具 举报
浪弦丶 发表于 2016-11-13 14:24
是的int 强转long类型

谢啦,已搞懂!
回复 使用道具 举报
byte 类型进行数据运算时候  byte类型会自动提升为int类型  当提升为int类型时候就会导致运算结果为int类型   当使用byte接收int类型数据时候  就会出现精度丢失   
同时 当用long类型存储数值常量的时候  当在int类型数据范围之内的时候可以不添加L作为结束 当超过时候就要添加L表示一个为long类型数据   有时在  long  l =  123456789+987654321  假设两个运算数据在int范围内 但是运算结果可能超过int范围 所有这时也有可能报错
回复 使用道具 举报
hlll 中级黑马 2016-12-4 23:04:52
8#
b = (byte)(b1 + b2);中强转的原因,就是因为变量值不确定(编译时不能识别变量里的值),单个都是byte; 但相加就有超出的可能x,只有确定值时才不会(b = 3 + 4;)
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马