首页 > 技术文章 > 基本数据类型

yumiaoxia 2018-04-15 00:35 原文

  1 package com.yumiaoxia.datatype;
  2 /**
  3  * 序言:1.java支持的类型分为基本类型和引用类型,基本类型分为boolean(布尔)类型和数值类型
  4  *     2.八大数据类型(byte,short,int,long,float,double,char,boolean)
  5  *     3.数值的4种表示方式:十进制,二进制(整数以0B或0b开头),八进制(整数以0开)和16进制(整数以0x或0X开头),
  6  *       最高位表示符号为,例如1代表负数,0代表正数
  7  *     4.数值在计算机内存中以二进制形式存在的,原码是直接将数值换成二进制数,
  8  *       正数原码与补码相同,负数的补码是其反码加1,最高符号为不变
  9  *     5.有些特殊字符代表特殊的含义,例如占位符,使用时需要转义
 10  *     
 11  *     
 12  * byte(字节型):占一个字节(8位),表示范围-2^7~2^8,即-127~128
 13  * short(短整型):占两个字节(16位),表示范围-2^15~2^16
 14  * int(整型):占四个字节(32位),表示范围-2^31~2^32,整数默认类型
 15  * long(长整型):占八个字节(64位),表示范围-2^63~2^64
 16  * 
 17  * char(字符型):占两个字节(16位),其变量,值可参加数学运算和比较大小,其实是用该字符的编码参与运算。
 18  *            每个字符都有特定的16进制编码,格式“\\uxxxx”表示,计算机底层保存字符的对应编号,范围0~65535,
 19  *            
 20  * 
 21  * 
 22  * float与double类型
 23  * 1. 范围
 24      float(单精度说明符),double(双精度说明符)
 25                单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。
 26                双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
 27       float和double的范围是由指数的位数来决定的。
 28       float的指数位有8位,而double的指数位有11位,分布如下:
 29       float:
 30       1bit(符号位) 8bits(指数位) 23bits(尾数位)
 31       double:
 32       1bit(符号位) 11bits(指数位) 52bits(尾数位)
 33       于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,
 34       并且指数位是按补码的形式来划分的。其中负指数决定了浮点数所能表达的绝对值最小的非零数;
 35       而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
 36       float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;
 37       double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
 38 2.  精度
 39       float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,
 40          其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
 41       float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,
 42          也即float的精度为6~7位有效数字;
 43       double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
 44  * 
 45  *注意点:1.String类型表示字符串,不是基本数据类型,是字符的集合,用双引号括起来,char类型使用单引号
 46  *     2.通常情况下,直接给出一个整数值默认int类型,如果将以一个较小的整数值赋给一个byte和short类型,
 47  *      系统会自动把这个整数值当成byte和short类型处理,而一个巨大的整数值(超出int范围),
 48  *      java不会自动把这个整数值当成long类型处理,应该在整数值后增加l或L,推荐L与1区分
 49  *     3.java浮点数使用二进制科学记数法表示,因此不可能精确表示一个浮点数,double类型浮点数会更精确一些,
 50  *       但仍然不能精确表示,开发者如果需要精确保存一个浮点数,则可以考虑使用BigDecimal类
 51  *     4.Java提供三个特殊的浮点数值,正无穷大,负无穷大和非数。用正浮点数除以0得到正无穷大,负浮点数除以0得到负无穷大,
 52  *       但用整数值值除以0会抛出ArithmeticException;
 53  *       正无穷大通过Double和Float类的POSITIVE_INFINITY表示,
 54  *       负无穷大用Double和Float类的NEGATIVE_INFINITY表示,非数通过Double和Float类的NaN表示。
 55  *       必须指出正无穷大数值都相等,负无穷大数值都相等,非数不与任何数值甚至本身相等
 56  */
 57 
 58 public class BasicDataType {
 59 
 60     public static void main(String[] args) {
 61         int octalValue=013;//八进制数
 62         int hexValue1=0x13;//16进制数
 63         int hexValue2=0xaf;
 64         System.out.println("octalValue:"+octalValue);
 65         System.out.println("hexValue1:"+hexValue1);
 66         System.out.println("hexValue2:"+hexValue2); 
 67         
 68         //定义两个八进制数
 69         int binVall = 0b11010100;//位数不足用0补全再保存
 70         byte binVall2 = 0B01101001;
 71         int binVall3=0B10000000000000000000000000000011;//减一取反得原码1111111111111111111111111111111101
 72         System.out.println("binVall1:"+binVall);
 73         System.out.println("binVall2:"+binVall2);
 74         System.out.println("binVall3:"+binVall3);
 75         
 76         byte binVall4=(byte) 130;//超出范围溢出,计算方法,换成二进制10000010减1取反算出原码11111110=-126
 77         byte binVall5=(byte) 0b11101001;//0b11101001本身是int类型,强转成byte类型产生溢出
 78         //定义一个64位二进制long型整数
 79         long binVall6=0B1000000000000000000000000000000011L;//1不是符号位
 80         System.out.println("binVall4:"+binVall4);
 81         System.out.println("binVall5:"+binVall5);
 82         System.out.println("binVall6:"+binVall6);
 83         
 84         float af = 5.2345556f;
 85         //下面值发生改变
 86         System.out.println("af:"+af);
 87         
 88         double a=0.0;
 89         double c=Double.NEGATIVE_INFINITY;
 90         double d=Float.NEGATIVE_INFINITY;
 91         System.out.println("负无穷大相等吗?"+(c==d));
 92         
 93         //0.0除以0.0出现非数
 94         System.out.println(a/a);
 95         System.out.println("两个非数相等吗?"+(c==a));
 96         
 97         //所有正无穷大都是相等的
 98         System.out.println("所有正无穷大都是相等吗"+(6.0/0==555.0/0));
 99         
100         //负数除以0.0得到负无穷大
101         System.out.println(-8/0.0);
102         
103         //整数除以0报出异常
104         
105             System.out.println(0/0);
106         
107         
108     }
109 
110 }

 

控制台输出:

octalValue:11
hexValue1:19
hexValue2:175
binVall1:212
binVall2:105
binVall3:-2147483645
binVall4:-126
binVall5:-23
binVall6:8589934595
af:5.2345557
负无穷大相等吗?true
NaN
两个非数相等吗?false
所有正无穷大都是相等吗true
-Infinity
Exception in thread "main" java.lang.ArithmeticException: / by zero
 at com.yumiaoxia.datatype.BasicDataType.main(BasicDataType.java:105)

推荐阅读