zoukankan      html  css  js  c++  java
  • 简单讨论数据类型(byte)强制转化后的数值变化规律

    package com.wangzhu.datatype;
    
    /**
     * Java基本数据类型练习
     * 
     * @ClassName: DataTypes
     * @Description: TODO
     * @author wangzhu
     * @date 2013-8-10 上午11:41:31
     * 
     */
    public class DataTypes {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // byte类型:数据范围:(-2^7 ~ 2^7-1),其中(2^7 = 128)
            byte num001 = 127;
            // byte num0011 = 128;//编译失败,超出了该类型的数据范围,若要将这个数据赋给该变量,则需要强制转化
            byte num0012 = (byte) 128;
            byte num0013 = (byte) 129;
            byte num0014 = (byte) 1000;
            byte num002 = -128;
            // byte num0021 = -129;//编译失败,超出了该类型的数据范围,若要将这个数据赋给该变量,则需要强制转化
    
            byte num0022 = (byte) -129;
            byte num0023 = (byte) -130;
            byte num0024 = (byte) -490;
            System.out.println("num001 = " + num001 + " num0012 = " + num0012
                    + " num0013 = " + num0013 + " num0014 = " + num0014
                    + " num002 = " + num002 + " num0022 = " + num0022
                    + " num0023 = " + num0023 + " num0024 = " + num0024);
            // num001 = 127 num0012 = -128 num0013 = -127 num0014 = -22 num002 =
            // -128 num0022 = 127 num0023 = 126 num0024 = 22
            // 从结果可以看出,当赋给的变量值超过了该类型的数据范围时,则其会从该类型的数据范围的最大值或最小值,加上或减去超出的部分,最后并加一或减一,结果就是该变量的值
            // 例如:本例中,num0013,其比最大值(127)大2,那么最小值应该加上2,并减去1,故num0013 = -127
            // 例如:本例中,num0023,其比最小值(-128)小2,那么最大值应该减去2,并加上1,故num0013 = 126
            // 但是,对于num0014,num0024,按照上述方法,计算的结果和输出不同,其实不是的,其中还有点细节,具体如下:
            // 对于超出最大值的,则其结果必然是非正数,对于超出最小值的,则其结果必然是非负数。
    
            for(int i = 0 ;i < 1000;i ++){
                byte numi = (byte)i;
                int ii = test(i,127,256);
                if(!String.valueOf(ii).equals(String.valueOf(numi)))
                {
                    System.out.println("i = " + i + " == " + (i - 127) + " numi = " + numi + "  ii= " + ii);
                }
            }
            for(int i = -1000 ;i < 0;i ++){
                byte numi = (byte)i;
                int ii = test(i,-128,256);
                if(!String.valueOf(ii).equals(String.valueOf(numi)))
                {
                    System.out.println("i = " + i + " == " + (i + 127) + " numi = " + numi + "  ii= " + ii);
                }
            }
            //总结:对于正数,其实在下列数列中数到第i个数,就是i强制转化的结果,该数列为:0 ~ 127,-128 ~ 0 ~ 127,-128 ~ 0 ~ 127...
            //总结:对于负数,其实在下列数列中数到第i个数,就是i强制转化的结果,该数列为:0 ~ -128,127 ~ 0 ~ -128,127 ~ 0 ~ -128...
            
            
            
        }
    
        /**
         * 测试数据类型为byte时,数据超出范围后的值的规律
         * @param num 强制转换的值
         * @param normal 正向最大值或负向最小值
         * @param maxNum 数据范围的大小
         * @return    测试规律的结果
         */
        public static int test(int num, int normal,int maxNum) {
            num = num % maxNum;
            int value = -1;
            if (normal > 0) {
                if(num <= normal){
                    value = num;
                }else{
                    value = num - normal;
                    normal ++;
                    value  = value - normal - 1 ;
                }
            } else {
                if(num >= normal){
                    value = num;
                }else{
                    value = num - normal;
                    normal ++;
                    value = value - normal + 1;
                }
            }
            return value;
        }
    
    }

    以上是本人闲暇时,根据自己所猜测的想法,实现了一下。其中想法可能不太成熟,若有错误,请指出,谢谢!仅供参考!

    补充:对于int转换为byte,就是截取32位int的后8位,若此时的高位是1,则表明该byte是负数,否则是正数!!!强制类型转换会丢失高位,只保留转换类型的位数。

  • 相关阅读:
    javaweb学习总结二十六(response对象的用法二 下载文件)
    javaweb学习总结二十五(response对象的用法一)
    线程池的使用
    javaweb学习总结二十四(servlet经常用到的对象)
    javaweb学习总结二十三(servlet开发之线程安全问题)
    创建与删除索引
    Oracle中exists与in的区别
    win7安装IIS及将网站发布到IIS上
    C# toolstrip 上添加DateTimePicker Control控件
    用java实现zip压缩
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/3250009.html
Copyright © 2011-2022 走看看