zoukankan      html  css  js  c++  java
  • 【转】java 彻底理解 byte char short int float long double

    本文转自 http://blog.csdn.net/hearrt/article/details/3951910

    遇到过很多关于 数值类型范围的问题了,在这做一个总结,我们可以从多方面理解不同数值类型的所能表示的数值范围

     在这里我们只谈论 java中的数值类型

     首先说byte:

    这段是摘自jdk中 Byte.java中的源代码:

    [java] view plaincopy
     
    1. /** 
    2.      * A constant holding the minimum value a <code>byte</code> can 
    3.      * have, -2<sup>7</sup>. 
    4.      */  
    5.     public static final byte   MIN_VALUE = -128;  
    6.   
    7.     /** 
    8.      * A constant holding the maximum value a <code>byte</code> can 
    9.      * have, 2<sup>7</sup>-1. 
    10.      */  
    11.     public static final byte   MAX_VALUE = 127;  

    从这里可以看出 byte的取值范围:-128 --- 127;

    从计算机组成原理的角度可以解释:byte在计算机中是占8个字节的 而且byte 是有符号整形 用二进制表示时候最高位为符号位 0代表正数 1代表负数。

    最大值:127      0111 1111 即2的7次方减去1;

    最小值:-128 这个数字曾经困扰我很久, 要知道正数在计算机中是以原码形式存在的,负数在计算机中是以其补码形式存在的,那么一个负数的补码是怎么计算的呢? 就是负数的绝对值的原码转为二进制再按位取反后加1,

    下边这个10和-10为例来介绍的 :10原码:0000 1010   它在计算机中的存储就是 0000 1010, 那么-10呢? 按照前面说的 算除其绝对值为10,转为二进制 0000 1010 按位取反 1111 0101 再加1后:1111 0110,此为-10补码 ,好的,计算机中的1111 0110就是代表-10了。

     我们来看 -128  绝对值128的二进制表示:1000 0000 按位取反 0111 1111 加1后:1000 0000,也就是说 -128在计算机中的表示就是 1000 0000 了, 再来看一下-129 在计算机中的表示,绝对值129的范围已经超出了了byte的位数。

    再有还可以通过

    [java] view plaincopy
     
    1. System.out.println(Byte.MAX_VALUE); //最大值  
    2.         System.out.println(Byte.MIN_VALUE); //最小值  

    输出Byte的最大值和最小值。

    综上所述 byte的取值范围只能是:-128 -- 127了  即 负的2的7次方到2的7次方减去1。

    相应的 short 作为16位有符号整形,int作为32位有符号整形,  long 作为64位有符号整形 都可以如上计算出 取值范围

    char作为16位无符号整形 其范围为 0 -- 2的15次方 这无可争议

    摘自 Character.java中的源代码:

    [java] view plaincopy
     
    1. /** 
    2.      * The constant value of this field is the smallest value of type 
    3.      * <code>char</code>, <code>'/u0000'</code>. 
    4.      * 
    5.      * @since   1.0.2 
    6.      */  
    7.     public static final char   MIN_VALUE = '/u0000';  
    8.   
    9.     /** 
    10.      * The constant value of this field is the largest value of type 
    11.      * <code>char</code>, <code>'/uFFFF'</code>. 
    12.      * 
    13.      * @since   1.0.2 
    14.      */  
    15.     public static final char   MAX_VALUE = '/uffff';  

    float作为32位的浮点型:

    摘自Float.java源码:

    [java] view plaincopy
     
    1. /** 
    2.      * A constant holding the largest positive finite value of type 
    3.      * <code>float</code>, (2-2<sup>-23</sup>)·2<sup>127</sup>. 
    4.      * It is equal to the hexadecimal floating-point literal 
    5.      * <code>0x1.fffffeP+127f</code> and also equal to 
    6.      * <code>Float.intBitsToFloat(0x7f7fffff)</code>. 
    7.      */  
    8.     public static final float MAX_VALUE = 3.4028235e+38f; // 0x1.fffffeP+127f  
    9.   
    10.     /** 
    11.      * A constant holding the smallest positive nonzero value of type 
    12.      * <code>float</code>, 2<sup>-149</sup>. It is equal to the 
    13.      * hexadecimal floating-point literal <code>0x0.000002P-126f</code> 
    14.      * and also equal to <code>Float.intBitsToFloat(0x1)</code>. 
    15.      */  
    16.     public static final float MIN_VALUE = 1.4e-45f; // 0x0.000002P-126f  

    double 作为64为浮点型

    Double.java源码:

    [c-sharp] view plaincopy
     
    1. /** 
    2.      * A constant holding the largest positive finite value of type 
    3.      * <code>double</code>, 
    4.      * (2-2<sup>-52</sup>)·2<sup>1023</sup>.  It is equal to 
    5.      * the hexadecimal floating-point literal 
    6.      * <code>0x1.fffffffffffffP+1023</code> and also equal to 
    7.      * <code>Double.longBitsToDouble(0x7fefffffffffffffL)</code>. 
    8.      */  
    9.     public static final double MAX_VALUE = 1.7976931348623157e+308; // 0x1.fffffffffffffP+1023  
    10.   
    11.     /** 
    12.      * A constant holding the smallest positive nonzero value of type 
    13.      * <code>double</code>, 2<sup>-1074</sup>. It is equal to the 
    14.      * hexadecimal floating-point literal 
    15.      * <code>0x0.0000000000001P-1022</code> and also equal to 
    16.      * <code>Double.longBitsToDouble(0x1L)</code>. 
    17.      */  
    18.     public static final double MIN_VALUE = 4.9e-324; // 0x0.0000000000001P-1022  
  • 相关阅读:
    poj 2528 Mayor's posters (线段树+离散化)
    poj 1201 Intervals (差分约束)
    hdu 4109 Instrction Arrangement (差分约束)
    poj 1195 Mobile phones (二维 树状数组)
    poj 2983 Is the Information Reliable? (差分约束)
    树状数组 讲解
    poj 2828 Buy Tickets (线段树)
    hdu 1166 敌兵布阵 (树状数组)
    Ubuntu网络配置
    Button控制窗体变量(开关控制灯的状态)
  • 原文地址:https://www.cnblogs.com/xiaoQLu/p/3009142.html
Copyright © 2011-2022 走看看