透析Java本质-谈类型转换的神秘
package com.java.essence_36;

/**
 * Created by lw on 14-5-18.
 * <p/>
 * 类型转换的神秘
 */
class Int2Byte {

    int i = 10;
    byte b = 1;
    char c = 1;
    short s = 1;

    //隐式的进行类型转换
    float f = i;
    long l = i;

    //显式的进行类型转换,注释掉的为编译错误
    //byte b1=i;
    byte b1 = (byte) i;
    //char c1=i;
    char c1 = (char) i;
    //short s1=i;
    short s1 = (short) i;

}

/**
 * char无符号类型(0~65535)
 * byte(-128~127)
 * short(-32768~32767)
 * <p/>
 * 因此char与byte、short不存在子集关系,需要做类型转换
 * <p/>
 * 其次当byte、char、short(或者三者之间进行混合运算)结果为int
 * 并非与较高的类型相同
 */
class Conversion {

    private static void demo_1() {
        //隐式转换
        byte b = -23;
        short s = 60;
        char c = '二';
        char c1 = 89;

        //需要显式转换
        b = (byte) c;
        c = (char) b;
        s = (short) b;
        b = (byte) -b;
        s = (short) (b + c);
        b = (byte) (b + 1);
        b += 1;
    }
}

/**
 * 扩展收缩转换
 * 从byte-char
 * 1.将byte扩展为int
 * 2.将int收缩为char
 */
public class TypeConversion {


    private static void demo_1() {
        //byte为非负数
        byte b = 10;
        char c = (char) b;
        int i = c;
        System.out.println("TypeConversion.demo_1()->i=" + i);

        //byte为负数
        b = -10;
        c = (char) b;
        i = c;
        System.out.println("TypeConversion.demo_1()->i=" + i);
        /**
         *  1.byte b=-10;
         *      补码为:
         *      1 1 1 1  0 1 1 0
         *  2.扩展为int型,因为byte是有符号类型,所以执行符号位扩展,
         *    扩展的24位符号为(1),补码为:
         *    1 1 1 1  1 1 1 1  1 1 1 1  ...1 1 1 1  0 1 1 0
         *
         *  3.将int转为char,直接截取低16位,补码为
         *      1 1 1 1  1 1 1 1  1 1 1 1   0 1 1 0
         *
         *  4.然后将char转为int,因为char为无符号类型,ku扩展的16位为0
         *      16个0 +  1 1 1 1  1 1 1 1  1 1 1 1   0 1 1 0
         *
         * 因此结果为65526
         *
         */


        //输出所有转换后值改变的byte值
        int temp = 0;
        for (int m = Byte.MIN_VALUE, n = Byte.MAX_VALUE; m < n; m++) {
            b = (byte) m;
            c = (char) b;
            i = c;
            if (b != i) {
                System.out.print("[b=" + b + ",i=" + i + "]");
                if (++temp % 4 == 0) {
                    System.out.println();
                }
            }
        }
        System.out.println("共有[" + temp + "]个值转换后改变!");
    }

    // final修饰的 short变量赋值给 byte,可以通过编译吗?
    private static void test() {
        /*
        final short s = 30;
        byte b = s;
        */
    }

    public static void main(String[] args) {
        demo_1();

        //test();
    }
}

推荐文章

你如何将时间或日期转换成友好的url字符串?

你如何将时间或日期转换成友好的url字符串?

推荐文章

Firefox插件,告诉您使用的css样式

Firefox插件,告诉您使用的css样式

推荐文章

有任何GWT小部件库与uiBinder兼容吗?

有任何GWT小部件库与uiBinder兼容吗?

推荐文章

来自外部文件的jquery

来自外部文件的jquery

推荐文章

如何在google maps v3上使用frompointtolatling

如何在google maps v3上使用frompointtolatling

推荐文章

使用api v2在Google地图上添加多个标记

使用api v2在Google地图上添加多个标记

推荐文章

Visual Studio和TortoiseHg:文件夹在VS中不可见

Visual Studio和TortoiseHg:文件夹在VS中不可见

推荐文章

Rails是否有助于学习PHP-Zend框架

Rails是否有助于学习PHP-Zend框架

推荐文章

Jboss服务启动然后停止

Jboss服务启动然后停止

推荐文章

2个重载有相似的转换

2个重载有相似的转换

推荐文章

SOA最常用的技术是什么?

SOA最常用的技术是什么?

推荐文章

如果我的电话状态更改侦听器绑定到某个服务并且该服务终止,我是否需要费心注销它?

如果我的电话状态更改侦听器绑定到某个服务并且该服务终止,我是否需要费心注销它?

推荐文章

强制GridView只显示一行?

强制GridView只显示一行?

推荐文章

Rails 3 AJAX远程表单回调

Rails 3 AJAX远程表单回调

推荐文章

C语言中的字符串分析

C语言中的字符串分析

推荐文章

如何模拟子弹物理引擎中的传送带?

如何模拟子弹物理引擎中的传送带?