

数据类型占用字节大小排序:
byte(1),short(2),char(1,2,3) -- int(4) -- long(8)
float(4) – double(8)
float的宽限分段:4个字节 1位是符号位、8位是指数位、23位是尾数位
指数是指多少次方,指数位取值范围为0~255,总共有256个数
IEEE 754规定 0表示0,255表示无穷大,还有1-254可用,最后就有-126~127
假设M=2
Float: 2 * 2^127
Long: 2 * 2^63

class VariableTest1 {
public static void main(String[] args) {
//1. 整型:byte(1字节=8bit) short(2字节) int(4字节) long(8字节)
//① byte范围:-128 ~ 127
byte b1 = 12;
byte b2 = -128;
//b2 = 128;//编译不通过
System.out.println(b1);
System.out.println(b2);
// ② 声明long型变量,必须以"l"或"L"结尾
// ③ 通常,定义整型变量时,使用int型。
short s1 = 128;
int i1 = 1234;
long l1 = 3414234324L;
System.out.println(l1);
//2. 浮点型:float(4字节) double(8字节)
//① 浮点型,表示带小数点的数值
//② float表示数值的范围比long还大
double d1 = 123.3;
System.out.println(d1 + 1);
//③ 定义float类型变量时,变量要以"f"或"F"结尾
float f1 = 12.3F;
System.out.println(f1);
//④ 通常,定义浮点型变量时,使用double型。
//3. 字符型:char (1字符=2字节)
//① 定义char型变量,通常使用一对'',内部只能写一个字符
char c1 = 'a';
//c1 = 'AB';//编译不通过
System.out.println(c1);
char c2 = '1';
char c3 = '中';
char c4 = 'ス';
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
//② 表示方式:1.声明一个字符 2.转义字符 3.直接使用 Unicode 值来表示字符型常量
char c5 = '/n';//换行符
c5 = '/t';//制表符
System.out.print("hello" + c5);
System.out.println("world");
char c6 = 'C';
System.out.println(c6);
//4.布尔型:boolean
//① 只能取两个值之一:true 、 false
//② 常常在条件判断、循环结构中使用
boolean bb1 = true;
System.out.println(bb1);
boolean isMarried = true;
if(isMarried){
System.out.println("你就不能参加"单身"party了!\n很遗憾");
}else{
System.out.println("你可以多谈谈女朋友!");
}
}
}
A:byte,short,char—int—long—float—double
B:byte,short,char相互之间不转换,他们参与运算首先转换为int类型
C:boolean类型不能转换为其他的数据类型
D:常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,如果不是,才报错。
实例
/*
基本数据类型之间的运算规则:
前提:这里讨论只是7种基本数据类型变量间的运算。不包含boolean类型的。
1. 自动类型提升:
结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。
byte 、char 、short --> int --> long --> float --> double
特别的:当byte、char、short三种类型的变量做运算时,结果为int型
2. 强制类型转换:见VariableTest3.java
说明:此时的容量大小指的是,表示数的范围的大和小。比如:float容量要大于long的容量
*/
class VariableTest2 {
public static void main(String[] args) {
byte b1 = 2;
int i1 = 129;
//byte b2 = b1 + i1;//编译不通过
int i2 = b1 + i1;
long l1 = b1 + i1;
System.out.println(i2);
float f = b1 + i1;
System.out.println(f);
short s1 = 123;
double d1 = s1;
System.out.println(d1);//123.0
//***************特别地*********************
char c1 = 'a';//97
int i3 = 10;
int i4 = c1 + i3;
System.out.println(i4);
short s2 = 10;
//char c2 = c1 + s2;//编译不通过
byte b2 = 10;
//char c3 = c1 + b2;//编译不通过
//short s3 = b2 + s2;//编译不通过
//short s4 = b1 + b2;//编译不通过
//****************************************
}
}
实例
byte a = 3;
int b = 4;
System.out.println(a + b);
//byte c = a + b;(×)[可能损失精度]
int c = a + b;
面试题
1、byte b1=3,b2=4,b;
b = b1 + b2;//(×)因为变量相加,会首先看类型问题,最终把结果赋值的也会考虑类型问题。
b = 3 + 4;//(√)常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,如果不是,才报错。
哪句是编译失败的呢?为什么呢?
2、看看下面两个定义有没有区别呢
float f = 12.345F;(√)
float f = (float)12.345;(√)
3、char类型能否存储一个中文字符?为什么
解答:可以。一个char是两个字节,而一个中文也是两个字节
从大的数据类型到小的数据类型。
格式
目标数据类型 变量 = (目标数据类型) (被转换的数据);
注意
不要随意的去使用强制转换,因为它隐含了精度损失问题。
byte a = 3;
int b = 4;
int c1 = a + b;//(√)
byte c3 = a + b;//(×)
byte c = (byte) (a + b);//用强制类型转换改进
实例
/*
强制类型转换:自动类型提升运算的逆运算。
1.需要使用强转符:()
2.注意点:强制类型转换,可能导致精度损失。
*/
class VariableTest3 {
public static void main(String[] args) {
double d1 = 12.9;
//精度损失举例1
int i1 = (int)d1;//截断操作
System.out.println(i1);
//没有精度损失
long l1 = 123;
short s2 = (short)l1;
//精度损失举例2
int i2 = 128;
byte b = (byte)i2;
System.out.println(b);//-128
}
}
面试题
1、请问下面这个有没有问题
double d = 12.345;
float f = d;//(×)
解:把double赋值给float,加了强制类型转换
double d = 12.345;
float f = (float)d;
2、看看下面两个定义有没有区别呢?
float f1 = (float)12.345;
float f2 = 12.345f;
解:f1其实是通过一个double类型转换过来的,而f2本身就是一个float类型。
3、byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
解:因为byte的范围是:-128到127。
而130不在此范围内,所以报错。
我们可以使用强制类型转换
byte b = (byte) 130;//结果是多少呢?
分析过程:
我们要想知道结果是什么,就应该知道是如何进行计算的。
而我们又知道计算机中数据的运算都是补码进行的。
而要得到补码,首先要计算出数据的二进制。
A:获取130这个数据的二进制。
00000000 00000000 00000000 10000010
这是130的原码,也是反码,还是补码。
B:做截取操作,截成byte类型的了。
10000010
这个结果是补码。
C:已知补码求原码。
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110