关于java变量和运算符
1.1整形变量
int 变量名=初始值;
注意事项:
- int便是变量的类型是一个整形
- 变量名是变量的标识,后续都是用这个名字来使用变量
- 初始化操作时可选,这里建议创建变量的时候进行初始化
- 在java中,一个int变量占4个字节,和操作系统没有直接关系
什么是字节
字节是计算机中表示空间大小的基本单位
计算机使用二进制存储数据,8个二进制位为一个字节
我们平时的计算机内存为8GB内存,就是8G个字节
其中1KB=1024Byte,1MB=1024KB
8GB相当于80多亿个字节
4个字节所表示的数据范围大概是-21亿~21亿(2^32)/2
使用以下代码查看java中的整形数据范围:
System.out.println(Integer.MAX_VALUE); // int 的最大值
System.out.println(Integer.MIN_VALUE); // int 的最小值
java是没有无符号类型的
看这样一组代码
public class Num {
public static void main(String[] args) {
int num=Integer.MAX_VALUE;
int num2=Integer.MIN_VALUE;
System.out.println(num+"and"+num2);
for(int i=31;i>=0;i--){
System.out.printf("%d",num>>i&1);
}
System.out.println("\t");
for(int i=31;i>=0;i--){
System.out.printf("%d",num2>>i&1);
}
}
}
结果如下:
public class Num {
public static void main(String[] args) {
int num=Integer.MAX_VALUE+1;
int num2=Integer.MIN_VALUE-1;
System.out.println(num+"and"+num2);
for(int i=31;i>=0;i--){
System.out.printf("%d",num>>i&1);
}
System.out.println("\t");
for(int i=31;i>=0;i--){
System.out.printf("%d",num2>>i&1);
}
}
}
1.2长整形变量
long num=10L;//定义一个长整形变量,初始值写作10L
注意事项
- 初始化设定的值可以为10L,也可以是10l
- java中long类型占8个字节,即64比特位
- 表示的数据范围-2^63 -> 2^63-1
1.3双精度浮点型变量
代码示例
double num=1.0;
system.out.println(num);
public class Numtype {
public static void main(String[] args) {
int num=1.1;
System.out.println(num*num);
}
}
Java 中的 double 虽然也是 8 个字节, 但是浮点数的内存布局和整数差别很大, 不能单纯的用 2 ^ n 的形式表示数据范
围.
Java 的 double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势
必会存在一定的精度误差.
1.5字符类型变量
代码示例
char ch='A';
计算机中的字符本质上是一个整数。在C语言中使用ASCII表示字符,而java中使用Unicode表示字符,因此一个字符占用两个字节,表示的字符种类更到,包括中文。
1.6字节类型变量
代码示例:
byte value=0;
system.out.println(value);
一个字节类型表示的也是整数,只占一个字节, 范围(-128~127) -2^7~ 2^7-1
1.8布尔类型变量
boolean value = true;
System.out.println(value);
- boolean 类型的变量只有两种取值, true 表示真, false 表示假.
- Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法.
- boolean 类型有些 JVM 的实现是占 1 个字节, 有些是占 1 个比特位, 这个没有明确规定.
1.9 字符串类型变量(重点)
代码示例
String name = "zhangsan";
System.out.println(name);
和上面的类型不同, String 不是基本类型, 而是引用类型(后面重点解释).
字符串中的一些特定的不太方便直接表示的字符需要进行转义.
转义字符示例
// 创建一个字符串 My name is "张三"
String name = "My name is \"张三\"";
关于字符串拼接
public class Numtype {
public static void main(String[] args) {
String a="sing dance ";
String b="dance basketball ";
int c=666;
String result=a+b+c;
System.out.println(result);
}
}
关于类型转换
java作为一个强类型编程语言,当不同类型之间的变量相互赋值的时候,会有严格的校验
有如下几个代码场景:
int 和long/double相互赋值
public class Typeconvert {
public static void main(String[] args) {
int a=10;
double b=20.0;
a=b;
}
}
这个时候进行编译,会出现编译报错
double的范围比int还要长,如果将double赋值给int,就有可能发生精度缺失,报错
那int赋值给double呢
public class Typeconvert {
public static void main(String[] args) {
int a=10;
double b=20.0;
b=a;
}
}
这个时候编译是会通过的
结论:不同数字类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型,反之则不行
int和boolean相互赋值
public class Typeconvert {
public static void main(String[] args) {
int a=10;
boolean b=false;
a=b;
b=a;
}
}
结论:int和boolean是毫不相干的两种类型,不能相互赋值
public class Typeconvert {
public static void main(String[] args) {
int a=10;
double b=20.0;
// a=b; 这样会却缺失精度,编译报错
a=(int)b;
}
}
编译之后我们发现程序可以正确编译并且执行
public class Typeconvert {
public static void main(String[] args) {
int a=10;
double b=20.0;
boolean c=false;
c=(boolean)a;
}
}
结论:使用(类型)的方式可以将double强转成int,但是,强制转换可能会导致精度丢失
强转类型不是一定能成功,互不相干的类型之间无法强转。
**
数值提升
**
int和long混合运算
int a = 10;
long b = 20;
int c = a + b; // 编译出错, 提示将 long 转成 int 会丢失精度
long d = a + b; // 编译通过.
当int和long混合运算的时候,int会提升成long,得到的结果依旧是long类型,此时再赋值给int类型,就会编译出错(long转成int)缺失精度
byte和byte的运算
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
// 编译报错
Test.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失
byte c = a + b;
^
byte和byte都是相同类型,但是出现编译报错,原因是,虽然a和b都是byte,但是计算a+b会先将a和b都提升成int,再进行计算,也就是(a+b)是一个int类型,赋值给byte类型,就会痴线精度确实,出现报错
类型提升小结:
- 不同类型的数据混合运算, 范围小的会提升成范围大的.
- 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算.