目录
> 字面常量
程序运行期间,固定不变的量称为常量。
·字面常量的分类
1.字符串常量:由“”括起来。
2.整形常量:直接写的数字(没有小数点)。
3.浮点数常量:直接写的小数。
4.字符常量:由‘’括起来。
5.布尔常量:true,false。
6.空常量:nul。
> 数据类型
主要分为两类:基本数据类型,引用数据类型。
·基本数据类型
四类八种,四类:整型,浮点型,字符型以及布尔型
包装类:包装类指的是基本数据类型对应的 类 类型,因为基本数据类型无法进行对象化处理,所以就引入了包装类,除了int对应的是Integer,char对应的是Character,其余的都是首字母大写即可,包装类均位于java.lang包
·注意
Java具有可移植性:不论是在64位系统还是32位系统,int都占用4个字节,long都占用8个字节。
整型和浮点型都是带有符号的。即可以表示正数也可以表示负数
整型默认为int型,浮点型默认为double。
字符串属于引用类型。
1Byte = 8bit
·符号位,数值位
举例一个byte其它以此类推:
byte 是一个字节保存的,有8个位,即8个0、1。
8 位的第一个位是符号位, 也就是说 0000 0001 代表的是数字1
1000 0000 代表的就是负数的最大值-1,所以正数最大位 0111 1111,也就是数字127
负数最大为 1111 1111,也就是数字-128,所以 Java 中的一个 byte 是 1 个字节,其范围是-128~127(128是2的7次方)
————————————————
版权声明:本文为CSDN博主「瀚海酒笑歌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_30160343/article/details/114397396
·为啥不是256呢?
很好的问题!Java中的byte数据类型范围为-128到127是因为它使用了二进制补码表示法来表示整数。在二进制补码表示法中,最高位(最左边的位)用于表示符号,0表示正数,1表示负数。这就意味着对于一个8位的byte类型,最高位被用来表示符号位,剩下的7位用来表示数值。
如果使用0-255的范围,将无法直接使用二进制补码来表示负数,因为没有一个特定的位来表示符号。这将导致在实现正负数表示时产生混淆和复杂性。因此,为了保持二进制补码表示的一致性和简单性,Java选择了在一个8位byte中表示范围为-128到127的有符号整数。
如果你需要表示0到255的无符号整数,你可以使用Java中的其他数据类型,例如char(无符号16位整数)或者使用int等更大范围的数据类型来存储。不同的数据类型在设计上有不同的考虑和用途,根据需要选择适当的类型是很重要的。
·原码,补码,反码
计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同 。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理
·原码求补码
求给定数值的补码分以下两种情况:
正数
正整数的补码是其二进制表示,与原码相同
例:+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)
负数
求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1
同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。
例:求-5的补码。
-5对应带符号位负数5(10000101)→除符号位外所有位取反(11111010)→加 00000001为 (11111011)
所以-5的补码是11111011。
0的补码
数0的补码表示是唯一的
[+0]补=[+0]反=[+0]原=00000000
[ -0]补=11111111+1=00000000
-128的补码
补码的计算有两种方法:
1.一个数取代数的负号运算,相当于先取反再加1,10000000先看成是负数,我们要知道它的绝对值是多少,就取反加1,可结果还是10000000。这时不能看成负数了,最高位是数值位,因此是128,所以原来是-128。
2.127是01111111,01111111+10000000=11111111,127+x=-1,=>x=-128。在八位整数里原码的取值范围为-127到+127,反码也是;在八位二进制中就把-0当作最小数-128用,也就是10000000
-0的原码:10000000
-0的反码:11111111
-128的补码:10000000
·引用数据类型
在Java中,引用类型的变量类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。今天我们从以下几个方面彻底掌握java的引用类型。
可以说在java语言中除了八种基本数据类型其余都是引用类型。常见的引用类型有以下几种:
> 变量
可以经常改变的内容,数据类型就是用来定义不同种类的变量。
在Java中局部变量必须初始化。否则会报错。
·语法格式
数据类型 变量名(标识符) = 初始值;
·变量类型
1.整型变量
2.长整型变量
3.短整型变量
4.字节型变量
5.浮点型变量(单精度,双精度)
6.字符型变量
7.布尔型变量
1.整型变量
int型变量所表示的范围
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
当赋值的“字面值常量”超过了变量能存储的最大值,会自动编译报错
int不论在任何系统下都是4个字节
建议在定义时直接给出初始值,如果没有合适的初始值,可以设置为0
在给变量设置初始值时,值不能超过int的表示范围,否则会导致溢出
变量在使用之前一定要赋值,否则会报错
int型的包装类型为Integer
2.长整型变量
定义长整型变量
long a = 0L;
为了区分int和long类型,一般建议long类型变量的初始值之后加L,小写也可以l,但和1不好区分
long型所能表示的范围
System.out.println(Long.MIN_VALUE);
System.out.println(Long.MIN_VALUE);
长整型在任何系统下都占8个字节
包装类型为Long
3.短整型变量
表示范围
System.out.println(Short.MIN_VALUE);
System.out.println(Short.MIN_VALUE);
short在任何系统下都占2个字节
包装类型为Short
4.字节型变量
字节型变量为1字节
范围是-128~127
5.浮点型变量
双精度浮点型
int c = 3;
int d = 4;
System.out.println(c/d);
结果是0,int除以int的值仍然是int(会直接舍弃小数部分),如果想得到0.5,需要使用double类型计算
神奇的代码
public class J829 {
public static void main(String[] args) {
double num = 1.1;
System.out.println(num*num);
}
}
运行结果并不是1.21
小数并没有一个非常精确的数字,只能说精确到小数后几位
double类型占8个字节
double的包装类型为Double
double类型的内存布局遵循IEEE 754标准(和C语言一样),尝试使用有限的内存空间表示可能无限的小数,势必会存在一定的精度误差,因此浮点数是个近似值而不是精确值
单精度浮点型
float类型在Java中占4个字节,同样遵守IEEE 754标准,由于表示的数据范围精度较小,一般在工程上用到浮点数都优先考虑double(默认double类型),不推荐使用float类型
float num = 1.0f;
float num = 1.0F;
float num = 1.0;//这个会报错
float的包装类为Float
问题引申
类比float的报错,为什么byte b = 10;10默认为int型为什么不报错呢?
对于小于4个字节的,byte,short,赋值的字面值没有超过最大范围表示的时候,并不会解析为int型,不会报错
浮点数的存储方式
浮点数与整数在内存中的存储方式不同,不能单纯的使用2的n次方来计算
java中浮点数采用的IEEE754标准,该标准的全称为IEEE 二进制 浮点数算术标准。这个标准规定的存储格式是这样的: 符号位+指数位偏移+尾数位
IEEE 754常用的两种表示浮点数值的方式:单精确度(float 32位)、双精确度(double 64位)
- 浮点数表示的数值:V = (-1)^s × M × 2^E
- 符号(sign) :1个bit表示,当s=0,V为正数;当s=1,V为负数。
- 阶码(exponent) :E的作用是对浮点数加权,用于存储科学计数法中的指数数据,并且采用移位存储。float类型的阶码是 8 bits,double类型的阶码是 11 bits。
- 尾数(significand) :M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M<2。(和十进制中范围为1~10一样)
6.字符型变量
java的字符类型采用的是Unicode编码方案,每个Unicode占用2个字节byte,16个比特bite位
char c1 = 'A';//大写字母
char c2 = '1';//数字字符
Java中的字符可以存放汉字,一个汉字代表两个字节,所以char类型占两个字节
char C3 = '帅';
Java中使用 单引号+单个字母 的形式表示字符的字面值
计算机中的字符本质上是一个整数,在C语言中使用ASCLL表示字符,一个ASCLL占一个字节,而Java采用的Unicode编码占两个字节,因此Java表示的字符更多,还可以表示阿拉伯文,希腊文等
7.布尔型变量
布尔类型常用来表示真假
boolean a = true;
boolean b = false;
System.out.println(a);
System.out.println(b);
boolean类型变量只有两种取值,true表示真,false表示假
Java中的boolean类型和int类型不能相互转换,不存在1表示true,0表示false这样的用法
因此boolean类型和int类型不能进行运算
Java虚拟机规范中,并没有明确规定boolean占的字节数,也没有专门用来处理boolean的字节码指令,在Oracle公司的虚拟机实现中,占1个字节
boolean的包装类型为Boolean
·类型转换
Java中类型转换主要分为两类:自动类型转换(隐式),强制类型转换(显式)。
int c = 10;
long d = 100l;
d = c;//可以通过编译
c = d;//编译失败
在Java中,当参与运算数据类型不一致时,就会出现类型转换
*隐式(自动)类型转换
自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理,特点:数据范围小的转为数据范围大的会自动进行转换
int a2 = 100;
long b2 = 10L;
b2 = a2;//a2和b2都是整型a2的范围小,b2的范围大,当将a2赋值给b2时,编译器会自动将a2提升为long类型,然后赋值
a2 = b2;//编译报错,long的范围比int范围大,会有数据丢失,不安全
float f = 3.14F;
double g = 5.12;
g = f;//编译器会将f转换为double,然后进行赋值
f = g;//double表示数据范围大,直接将double交给float会有数据丢失,不安全
byte q = 100;//编译通过,100没有超过byte的范围,编译器隐式将100转换为byte
byte w = 257;//编译失败,257超过了byte的数据范围,有数据丢失
*显式(强制)类型转换
代码需要经过一定的格式处理,不能自动完成。数据范围大的到数据范围小的。
public class J829_2 {
public static void main(String[] args) {
int a = 10;
long b = 100L;
b = a;//数据范围由小到大,隐式转换
a = (int)b;//由大到小,需要强制转换,否则编译失败
double d = 5.21;
a = d;//报错,类型不兼容
a = (int)b;//int没有double类型表示的数据范围大,需要强制转换,小数点之后全部丢失
boolean flag = true;
a = flag;//编译失败,类型不兼容
flag = a;//编译失败,类型不兼容
}
}
注意
不同数字类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型
如果需要把范围大的类型赋值给范围小的,需要强制类型转换,但是可能精度丢失
将一个字面值常量进行赋值的时候,Java会自动针对数字范围进行检查
强制类型转换不一定能成功,不相干的类型不能互相转换
·类型提升
不同类型的数据之间相互运算时,数据类型小的会被提升为数据类型大的
1.int与long之间
int会被提升为long
public class J829_3 {
public static void main(String[] args) {
int a = 10;
long b = 20;
int c = a+b;//编译出错,a在参与运算时被自动提升为long类型,因此a+b的结果为long类型,赋值给c的时候会有数据丢失
}
}
将c改为long类型则可编译成功
2.byte与byte类型
由于计算机的CPU通常是按照4个字节为单位从内存中读写数据,为了硬件上实现方便,诸如byte和short这种低于4个字节的类型,会先提升为int再参与运算
·字符串类型
String不属于基本数据类型,更不属于包装类型
在Java中使用String类定义字符串类型,比如
String s1 = "hello";
String s2 = "world";
System.out.println(s1+s2);//表示将s1和s2进行拼接
在C语言中,没有字符串类型,只有字符类型
Java中字符串的结尾不再有\0结尾
如何求长度
System.out.println(s1.length());
System.out.println(s2.length());
在有些情况下,需要将字符串和整型数字之间进行转换
int num = 10;
//方法一
String str1 = num+"";
//方法二
String str2 = String.valueOf(num);
//方法三
String str3 = "345";
int val = Integer.valueOf(str3);
int val2 = Integer.parseInt(str3);//parseInt是valueOf的底层,也可以
System.out.println(str1);
System.out.println(str2);
System.out.println(val+1);
字符串加整数
此时的加号起到拼接的作用 ,整体仍然是字符串
System.out.println("num = "+num);