目录
一、数据类型分类
整数类型
类型 | 占用 | 范围 | 默认值 |
---|---|---|---|
byte | 8位 | -128~127 | 0 |
short | 16位 | -32768~32767 | 0 |
int | 32位 | -231~231-1 | 0 |
long | 64位 | -263~263-1 | 0 |
- 位(bit):计算机内部数据存储的最小单位,11001100是一个八位二进制。
- 字节(byte):是计算机中数据处理的基本单位,习惯用大写B来表示。 1B=8bit
- 字符:是指计算机中使用的字母、数字、字和符号。*
Java中整型常量有四种表示方式:10进制、2进制、8进制和16进制,其中2进制的整数常量以0b开头,8进制的整数常量以0开头,16进制的整数常量以0x开头。
int a = 0b10;
int b = 010;
int c = 10;
int d = 0x10;
System.out.println(a); // 2
System.out.println(b); // 8
System.out.println(c); // 10
System.out.println(d); // 16
java整数常量默认就是int类型
// 将一个较小的整数常量赋值给一个byte或short变量,系统会自动把这个整数常量当成byte或者short类型来处理
byte num1 = 12;
short num2 = 13;
// 用一个大的整数常量时,Java不会自动把这个整数常量当成long类型来处理,应该在这个整数常量后增加L作为后缀
// long num3 = 3333333333333333333; 错误,这个数超过了int的表示范围。
long num3 = 3333333333333333333L;
// 以下情况是发生了类型转换,并不是直接将常量赋值给long类型
long num4 = 22;
字符类型
类型 | 占用 | 范围 | 默认值 |
---|---|---|---|
char | 16位 | 0~65535 | \u0000(空格) |
字符型通常用于表示单个字符,字符常量必须使用单引号括起来。
char是16位的,采取的Unicode的编码方式,所以char就有以下的初始化方式:
- char c = 'c'; // 字符,可以是汉字,因为是Unicode编码。需要加单引号。
- char c = 十进制数,八进制数,十六进制数都可以; // 可以用整数赋值【整数范围:0~65535】。输出字符编码表中对应的字符
- char c = '\u数字'; // 用字符的编码值来初始化,如:char ch = '\u9999'; 输出 ‘香’。
- char c = '\n'; // 通过转义字符标识特殊字符常量,如'\t'。
**在JAVA中,对char类型字符运行时,直接当做ASCII表对应的整数来对待 **
布尔类型
类型 | 占用 | 范围 | 默认值 |
---|---|---|---|
boolean | 32位 | true或false | false |
在JVM中并没有提供boolean专用的字节码指令,而boolean类型数据在经过编译后在JVM中会通过int类型来表示,此时boolean数据4字节32位,而boolean数组将会被编码成Java虚拟机的byte数组,此时每个boolean数据1字节占8bit。
浮点类型
类型 | 占用 | 范围 | 默认值 |
---|---|---|---|
float | 32位 | 第一个位是符号位,接下来8位表示指数,接下来的23位表示尾数 | 0.0f |
double | 64位 | 第一个位是符号位,接下来11位表示指数,接下来的52位表示尾数 | 0.0d |
定义float类型时,需要在值的后面加上F,因为默认为双精度浮点数。
浮点数虽然表示范围大,但是其范围并不是连续的
二、数据类型的转换
类型转换:某个类型的值直接赋值给另一种类型的变量
自动类型转换
系统支持把某个基本类型的值直接赋值给另一种基本类型的变量
箭头左边的数值型可以自动类型转换为箭头右边的数值型。
int a = 6;
float f = a;
byte b = 9;
// char c = b; 从上图可以,不可以将byte类型直接转换成char类型。
double d = b;
// 对于String:当把任何基本数据类型的值和字符串值进行连接运算时,基本类型的值将自动类型转换为字符串类型。
// String str1 = 5; 整数不能直接赋值给字符串。
String str2 = 3.5f + "";
强制类型转换
上图中右边的类型转换为左边的类型,必须使用强制类型转换,强制类型转换的运算符是圆括号。
// 当试图把表数范围大的类型转换成表数范围小的类型时,容易引起信息丢失
int iValue = 233;
byte bValue = (byte) iValue;
System.out.println(bValue); // -23
double dValue = 3.98;
int tol = (int) dValue;
System.out.println(tol); // 3
// 对于String:通过基本类型的包装类则可以实现把字符串转换成基本类型,Java为8种基本类型都提供了对应的包装类.
String a = "45";
System.out.println(Integer.parseInt(a)); // 45
表达式类型的自动提升
当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。规则如下:
- 所有byte型、short型和char型将被提升到int型。
- 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数相同的类型。
- 把"+"放在字符串和基本类型之间时,这个加号是一个字符串连接运算符,而不是进行加法运算。
System.out.println("hello" + 'a' + 7); // helloa7
System.out.println('a' + 7 + "hello"); // 104hello
三、浮点类型计算精度丢失问题
先看代码:
System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);
结果:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
原因:二进制无法精确表示1/10,就像十进制无法表示1/3一样
java 里的数字是采用IEEE 754 标准的64 位双精度浮点数。计算机中,保存float使用的是浮点表示法,分为三大部分:
- 第一部分用来存储符号位(sign),表示正负数
- 第二部分用来存储指数(exponent),用来表示指数
- 第三部分用来存储小数(fraction),用来表示小数,不足位数补0
-
指数位决定了大小范围,因为指数位能表示的数越大则能表示的数越大
-
而小数位决定了计算精度,因为小数位能表示的数越大,则能计算的精度越大
float表示数据的原理:
对于十进制数10.25 科学计数法为1.025×101
换算为二进制为1010.01 科学计数法为1.01001×23可以看出任意一个实型数可用二进制科学计数法表示为a×2b
其有效数字的范围a∈[1,2),即1.xxxx的形式,
整数部分1我们不管,把小数点后边的部分xxxx存储起来就是尾数部分m(23位)而指数部分2b 的幂b就存储为指数部分e (8位)
这样数据的表示方法就是(1+m)×2e
- float的小数位只有23位,即二进制的23位,能表示的最大的十进制数为2的23次方,即8388608,即十进制的7位,严格点,精度只能百分百保证十进制的6位运算。
- double的小数位有52位,对应十进制最大值为4 503 599 627 370 496,这个数有16位,所以计算精度只能百分百保证十进制的15位运算。
结合上述java中的浮点转换计算,当十进制数字无法用二进制表示进行计算时,自然会出现精度丢失的问题。
标签:类型转换,Java,int,基础,数据类型,System,println,类型,out From: https://www.cnblogs.com/gao05/p/16808317.html