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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liu45495284 中级黑马   /  2015-7-7 22:39  /  1743 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class VarDemo {
         public static void main(String[] args) {
             short s = 100;
             char  c = s;
             System.out.println(c);
}     
}
这个为什么会报错,不是说小的到大的会自动提升吗?

20 个回复

倒序浏览
你同桌已经问过了
回复 使用道具 举报
ava不像C和C++那样有许多标准未定义的东西,对基本的数据类型,Java对字长、符号、范围等都做了非常明确规定。  在Java中,char是16bit长的无符号整数,因此范围是:0~65535,而short则是16bit长的带符号整数,范围是-32768~32767。  所以,两者虽然字长相同,但意义却不一样(表示范围并不完全重合或包含),因此不管是char转换成short,还是short转换成char,都属于数值的“窄化转换”(Narrowing Primitive Conversion)。  窄化转化都可能“丢失精度”,因此必须强制转换。  虽然,这里的“丢失精度”跟从int到short的丢失精度给人的感觉似乎不一样,但仔细想想也没有什么区别,一方面,char有16个bit表示数值,而short用于表示数值大小的只有15个bit,因此,从char到short会“丢失数值精度”,而另一方面,short有1个bit表示数值的符号,而char却根本没有这么个符号位(所有的bit都用来表示数值大小了),所以从short到char也可能“丢失精度”,只是这里丢失的是有关正负的“精确程度”。
回复 使用道具 举报
楼上说的好详细 学习了。
回复 使用道具 举报
1木头1 发表于 2015-7-7 22:49
ava不像C和C++那样有许多标准未定义的东西,对基本的数据类型,Java对字长、符号、范围等都做了非常明确规 ...

非常感谢,学习了
回复 使用道具 举报
由于整数类型默认为int类型,当short类型的s赋值给c时自动转换为int类型,再赋值给char类型的c,可能会损失精度,         所以程序会报错。
回复 使用道具 举报
2楼说的详细
回复 使用道具 举报
需要强制提升的,char  c = (char) s;自动提升是隐士转换
回复 使用道具 举报
short类型和char类型的优先级是一样的,长度虽然都是两个字节(两个八位二进制),但是short的取值范围里有负数,而char的取值没有负数,两者的取值范围不同,这应该就是如果强制赋值给不同类型的变量会出现编译无法通过的原因了,
回复 使用道具 举报
char c=s ;复制过程中 s为变量,默认int类型,可能会损失精度
回复 使用道具 举报
收获了,学习了
回复 使用道具 举报
1木头1 发表于 2015-7-7 22:49
ava不像C和C++那样有许多标准未定义的东西,对基本的数据类型,Java对字长、符号、范围等都做了非常明确规 ...

说的太仔细了,我也学到了O(∩_∩)O~
回复 使用道具 举报
必须的。。。学习了
回复 使用道具 举报
学习了,说的详细
回复 使用道具 举报
2楼好厉害,又长知识了。char是无符号的16位正整数  short 是有符号16位
回复 使用道具 举报
1木头1 发表于 2015-7-7 22:49
ava不像C和C++那样有许多标准未定义的东西,对基本的数据类型,Java对字长、符号、范围等都做了非常明确规 ...

非常详细 ,学习了
回复 使用道具 举报
char c=s ;复制过程中 s为变量,默认int类型,可能会损失精度
回复 使用道具 举报
1木头1 发表于 2015-7-7 22:49
ava不像C和C++那样有许多标准未定义的东西,对基本的数据类型,Java对字长、符号、范围等都做了非常明确规 ...

很详细 学习了
回复 使用道具 举报
这个是错的,因为这是赋值而不是运算,自动提升是运算时候使用的,例如int a = s+100;就不会出错了
回复 使用道具 举报
char和short是一个级别的
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马