黑马程序员技术交流社区

标题: 关于强制转换 [打印本页]

作者: 张洪慊    时间: 2013-1-12 19:51
标题: 关于强制转换
看这个例子:
  byte b=2;//2为整形常量,在赋值给byte b时会检测2是否在-128~127范围内
  
  byte b1=2,b2=3,b3;
   b3=b1+b2;//b1,b2为变量,b1+b2的值为int型,可能会超出byte范围,因此不能赋值给b3
不知道理解有没有欠缺~~
由此我找了下 基本数据的转换规则
(1)当运算符为取正运算符(+)。取负运算符(-)或按位取反运算符(~)时,如果操作数为byte、char或short,则先被转换为int,再参与运算。
(2)当运算符为自动递增运算符(++)或自动递减运算符(--)时,如果操作数为byte,short或char,则不用先被转换为int,而是直接参与算术运算,且运算结果类型也不变。
(3)如果操作数为int或long,则无论运算符为何种单操作数运算符,均不发生类型转换,且运算结果类型也不变。
双操作数运算符算术运算时基本转换规则如下:
(1)如操作数之一为double,则另一个操作数先被转化为double,再参与算术运算。
(2)如两操作数均不为double,当操作数之一为float,则另一操作数先被转换为float,再参与运算。
(3)如两操作数均不为double或float,当操作数之一为long,、则另一操作数先被转换为long,再参与算术运算。
(4)如两操作数均不为double、float或long,则两操作数先被转换为int,再参与运算。
(5)如采用+=、*=等缩略形式的运算符,系统会自动强制将运算结果转换为目标变量的类型。
( 6 )  在赋值语句中,默认类型为整型的无小数点整数型文字值作为右操作数时,可以赋值给取值范围比整型小的变量,前提是文字值对于的实际数值在变量类型的取值范围内。而默认类     型为双精度的带有小数点的浮点数型文字值只能赋值给双精度型变量,不能赋值给单精度型变量。

麻烦浪费下时间,看看以上规则有没有错误或遗漏~~如果没有我想按照上述规则记忆.

作者: 李阳    时间: 2013-1-12 20:47
看的我头大,一句话,低精度向高精度自动转换,低精度向高精度要强制转换。
因为数据在计算机里是以0和1的形式存在,所以byte  b = 2;赋值了,并不检测2是否超出范围。
如果byte b = 511(二进制为0000-0001-1111-1111),b其实只拿到了1111-1111(十进制为—1),前面的二进制位全部舍去。
所以即便超出范围了,也会赋值,只是赋的值是错误的。
用的笔记本,没鼠标,不方便截图。你可以自己试下。
作者: jonn    时间: 2013-1-12 20:48
LZ 对jvm原理,类型的自动转换与强制转换理解比较肤浅,在这我也给自己学习学习下
针对于不同的操作系统,安装的不同版本的jvm,java程序运行就是基于jvm上分配内存空间,所给类型分配字节位与操作系统没关系,不管是32位还是64位,都可很好的运行
内存里存放的数据就是二进制,基数0和1计算,一个字节占8bit, LZ对 进制转换计算应该熟悉吧,这里就不提了,任何类型取值范围 有符号(就是负数) 到有符号(就是正数)
符号最高位是0 所以取值上 要少一个位 ,不同类型数据一旦声明,jvm就给他分配空间,空间大小基于变量的数据类型,若两个字面量计算时 超过 他们本身的空间,那就是内存溢出,打个比喻,一个12ml杯子,你给它装20ml的水了,多余的水就会流出来,就这意思,这就是要进行数据转换的根本,转换的原则 两个字面量向 空间分配字节数大的 转 若向字节数小的转,就损害了数据精确度而位运算就是几个二进制的关系运算而已,交给cpu处理运算
作者: 黑马-小龙    时间: 2013-1-12 21:11
byte b1=2,b2=3,b3;
    b3=b1+b2;//
结果:编译时会出现错误,原因就是:有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,
                          然后再进行计算。
作者: 张洪慊    时间: 2013-1-12 21:16
李阳 发表于 2013-1-12 20:47
看的我头大,一句话,低精度向高精度自动转换,低精度向高精度要强制转换。
因为数据在计算机里是以0和1的 ...

额,byte b=511;//根本就无法通过编译.
除非 byte b=(byte)511//发生后8位截断给了b
那个检测是否超出范围我是听毕老师这样讲的......
作者: 李阳    时间: 2013-1-12 21:40
张洪慊 发表于 2013-1-12 21:16
额,byte b=511;//根本就无法通过编译.
除非 byte b=(byte)511//发生后8位截断给了b
那个检测是否超出范 ...

确实是我弄错了
作者: 张洪慊    时间: 2013-1-12 21:56
李阳 发表于 2013-1-12 21:40
确实是我弄错了

没事,非常感谢你的回答.并不是我没事找事,感觉这块比较重要,不搞明白,以后会出现各方面小错误.

作者: 李云飞    时间: 2013-1-13 11:32
还加一点吧 布尔型的变量由于只能取真或假 所以不能对其进行强制类型转换




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