黑马程序员技术交流社区

标题: 默认int类型的猜想 [打印本页]

作者: 黑马嗨嗨嗨    时间: 2016-11-13 09:56
标题: 默认int类型的猜想
本帖最后由 黑马嗨嗨嗨 于 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, 下载次数: 73)

QQ截图20161113085424.png

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

QQ截图20161113090600.png

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

QQ截图20161113095028.png

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

2147483648l不是标识而是代表的是强制类型转换,哦,其实这就是可以看做是强制转换成  
(long)2147483648  让虚拟机识别出来对吧。
作者: 浪弦丶    时间: 2016-11-13 14:24
黑马嗨嗨嗨 发表于 2016-11-13 12:01
2147483648l不是标识而是代表的是强制类型转换,哦,其实这就是可以看做是强制转换成  
(long)21474836 ...

是的int 强转long类型
作者: 黑马嗨嗨嗨    时间: 2016-11-13 17:33
浪弦丶 发表于 2016-11-13 14:24
是的int 强转long类型

谢啦,已搞懂!
作者: lwd_1028    时间: 2016-11-24 14:26
byte 类型进行数据运算时候  byte类型会自动提升为int类型  当提升为int类型时候就会导致运算结果为int类型   当使用byte接收int类型数据时候  就会出现精度丢失   
同时 当用long类型存储数值常量的时候  当在int类型数据范围之内的时候可以不添加L作为结束 当超过时候就要添加L表示一个为long类型数据   有时在  long  l =  123456789+987654321  假设两个运算数据在int范围内 但是运算结果可能超过int范围 所有这时也有可能报错
作者: hlll    时间: 2016-12-4 23:04
b = (byte)(b1 + b2);中强转的原因,就是因为变量值不确定(编译时不能识别变量里的值),单个都是byte; 但相加就有超出的可能x,只有确定值时才不会(b = 3 + 4;)

作者: 1134323536    时间: 2016-12-7 10:38
对啊,int就是





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