免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 896 | 回复: 0
打印 上一主题 下一主题

java解惑学习笔记2 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-02 19:11 |只看该作者 |倒序浏览
java解惑学习笔记2:
4.初级问题
public class Elementary{
public static void main(String[] args){
  System.out.println(12345+5432l);
}
}
会打印什么?经过前面的例子后,对这些问题是更加小心翼翼了。吸取了上次的教训我乖乖
看文档,public static String toString(int i)  的作用是:
Returns a String object representing the specified integer. The argument is converted
to signed decimal representation and returned as a string和问题2一样也看不出什么东西出来,
没辙了只能看答案。天杀的!真恶心居然是5432l(是l不是1,真恶心 我还以为多高深哪)
经验:千万不要使用小写的l来作为long型字面常量的结尾或是作为变量名。

谜题5:十六进制的趣事
public class JoyOfHex{
public static void main(String[] args){
  System.out.println(
   Long.toHexString(0x100000000L + 0xcafebabe));
}
}
十进制字面常量具有一个很好的属性,即所有的十进制字面常量都是正的,
而十六进制或是八进制字面常量并不具备这个属性。要想书写一个负的十进制常量
,可以使用一元取反操作符(-)连接一个十进制字面常量。以这种方式,
你可以用十进制来书写任何int或long型的数值,不管它是正的还是负的,
并且负的十进制常数可以很明确地用一个减号符号来标识。
但是十六进制和八进制字面常量并不是这么回事,它们可以具有正的以及负的数值。
如果十六进制和八进制字面常量的最高位被置位了,那么它们就是负数。
在这个程序中,数字0xcafebabe是一个int常量,它的最高位被置位了,所以它是一个负数。
计算时对0xcafebabe进行有符号的扩展,扩展后的结果是:0xffffffffcafebabeL。
  0xffffffffcafebabeL
+ 0x0000000100000000L
---------------------
  0x00000000cafebabeL
计算结果溢出,所以输出是cafebabe 。
SOLUTION:
两个加数全声明为long型
System.out.println(
   Long.toHexString(0x100000000L + 0xcafebabeL) );

谜题6:多重转型
public class Multicast{
public static void main (String[] args){
  System.out.println((int)(char)(byte) -1);
}
}
猜猜会是什么?如果是-1那也太小儿科了吧!结果是:65535。想错的原因是没注意到char是无符号数据
类型,从byte到char的转换被认为不是一个拓宽原始类型的转换,而是一个拓宽并窄化原始类型的转换
(widening and narrowing primitive conversion):byte被转换成了int,而这个int又被转换成了char。
有一条很简单的规则能够描述从较窄的整型转换成较宽的整型时的符号扩展行为:1.如果最初的数值类型是有符号的,那么就执行符号扩展;
2.如果它是char,那么不管它将要被转换成什么类型,都执行零扩展。
由这个规则: -1(int: ffffffff)->byte:ff->char:ffff->int:0000ffff(65535).
SOLUTION:
1.如果你在将一个char数值c转型为一个宽度更宽的类型,并且你不希望有符号扩展
int i = c & 0xffff; //即使没有必要也写(写了也不明白是在干嘛?)
2.如果你在将一个char数值c转型为一个宽度更宽的整型,并且你希望有符号扩展,
那么就先将char转型为一个short,它与char具有同样的宽度,但是它是有符号的。
int i = (short) c;
3.如果你在将一个byte数值b转型为一个char,并且你不希望有符号扩展,那么
你必须使用一个位掩码来限制它。
char c = (char) (b & 0xff);应该是 char c = (char)( b & 0x7f) 吧! 把b的最高位清零然后再去
扩展,从而得到不带符号位的windening conversion.



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/28187/showart_242124.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP