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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fengche 中级黑马   /  2013-10-16 10:03  /  1939 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 fengche 于 2013-10-16 12:12 编辑

public class Demo{
        public static void main (String[] args){
                System.out.println((int)(char)(byte) -1);
        }
}
它打印出来的是65535而不是-1,这是为什么呢?

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

3 个回复

倒序浏览
你这样写的目的是什么呢?
数据类型之间的转换分为隐含类型转换(或称默认类型转换 )和强制类型转换两种。
自动类型转换按字节长度从“短”到“长”的优先关系依次为:
byte ---- short ---- int ---- long ----float ---- double
byte short char数据类型之间不能互相转换 都可以转成int型
强制类型转换 在变量名前面加上欲转换的类型,程序运行时就会自动将此行语句里的变量做类型转换的处理,并不影响原先定义的类型;
例:byte  a=10;  int b=20; byte c=a+(byte)b    c的输出结构为30
如果不定义数据类型 x=100; 那么变量x 默认的数据类型为int 数字默认
的数据类型为int型。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
在(int)(char)(byte) -1中
(byte) -1 --》10000001--》补码--》11111111,高位是符号位
(char)(byte) -1 --》char两字节,byte才一字节,补成两字节,按符号位补成11111111 11111111
(int)(char)(byte) -1 --》11111111 11111111 --》二进制转int便是65536了
其实-1从char转就可以了,(int)(char)-1 = 65536

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
我用myeclipse编写的代码,当我写System.out.println((byte)-1);的时候,我把鼠标放在println上是,显示的是调用println(int x)函数,System.out.println((char)(byte)(-1));当我这么写的时候,鼠标放在println上时,显示的是调用println(char x)函数,当我System.out.println((int)(char)(byte)-1);这么写的时候,鼠标放在println上显示的是调用println(int x)函数,那么我就知道了,是int型的-1转换成了char型,再被转换成了int型,关键是int型的-1转char型发生了变化,大家都知道数字在计算机里存储的都是按补码方式存储,int型的-1那么在计算机里存储的应该是32个二进制的1(int型是4个字节),当发生被强制转换成char型的时候,那么就发生了截取行为,因为char型只有2个字节且没有符合,所以就截取了后面的16位,char型没有符合,16个二进制的1对应的十进制数正好是65535,说以最终打印的是65535。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马