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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Union 高级黑马   /  2014-4-14 22:03  /  2158 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Union 于 2014-4-14 22:08 编辑

问题是:
  1. public class Demo {

  2.         public static void main(String[] args) {

  3.                 /*
  4.                 第一个问题(int)(char)(byte)-1的打印结果不应该是-1吗?
  5.                 为什么结果却是65535呢?
  6.                 三次转换到底是如何进行的呢?
  7.                 */
  8.                 System.out.println((int)(char)(byte)-1);


  9.                 /*
  10.                 第二个问题三元运算结果不应该是XX吗?
  11.                 为什么结果却是X   88呢??

  12.                 */
  13.                 char x='X';
  14.                 int i=0;
  15.                 System.out.println(true ? x : 0);
  16.                 System.out.println(false ? i : x);
  17.                     }
  18.                
  19.         }

复制代码





怎么也想不明白求高人指点!尽量详细!谢谢!



评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

6 个回复

正序浏览
路过,学习学习。
回复 使用道具 举报
第一步:把-1转换为byte类型  
第二步:把byte类型提升为int类型  1为0000 0001 取反加一 :
             1111 1111 1111 1111 1111 1111 1111 1111(二进制-1)
第三步:把int类型转化为char类型  去掉高位  1111 1111 1111 1111
第四步:char转化为int 前面补零 0000 0000 0000 0000 1111 1111 1111 1111 == 65535

byte转化char 要进行两步   byte→int→char
个人理解  仅供参考

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
水竹 发表于 2014-4-14 23:20
第一个 :
这是用到的几种基本类型的信息:
数据类型          位数                                范围

你好厉害啊!谢谢!
回复 使用道具 举报
Silent_memory 发表于 2014-4-14 22:43
System.out.println(false ? i : x);  
变量 i  x  类型不同,对于三目运算符会有自动类型提升的过程  会 ...

谢谢你啊!二楼的回答也不错!
回复 使用道具 举报
第一个 :
这是用到的几种基本类型的信息:
数据类型          位数                                范围
byte                        8                                -128~127
int                        32                    -2147483648~2147483647
char                        16                                0~65535

对于
  1. System.out.println((int)(char)(byte)-1);
复制代码
这句代码来说,先要执行(byte)-1:
-1 本身为int类型,被强制转换之后截断为8位,二进制表示为:11111111——8个1;
第二步再强制转换为char类型:
char 有16位,根据转换时候的规则,操作数首先要补齐位数,而上一步得到的结果又是负值,所以符号位扩展之后得到的结果为:1111111111111111——16个1;但是由于char类型不能表示负数,所以对应的它表示的值为65535,应该是一个空字符;
而最后再转换为int时候就会顺理成章的得到65535了。

第二个:
楼上说的对。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
System.out.println(false ? i : x);  
变量 i  x  类型不同,对于三目运算符会有自动类型提升的过程  会将 X 转为ASCII对应的数值  所以结果是 88  
第一个我暂时也没想明白
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马