java的基本数据类型
常量和变量
Java常量:用文本串表示,可以区分为不同类型
整数常量123 实数常量2.12
字符常量‘c’
逻辑常量true false
字符串常量 “hello”
常量:在程序运行期间其值保持不变的变量。
final定义常量——用符号表示常量
final double PI = 3.14159; // PI是实数类型常量
变量
定义:值在运行时可以改变的量
每个变量属于特定的数据类型,使用前要先声明,然后赋值,然后才能使用
变量的定义和初始化 int x = 9;
变量有一个名字,在内存中占存储单元,存储单元中存放变量的值(区分变量的名和变量的值)
数据类型
(1)整数类型
特点:无小数部分;允许负数 byte、short、int、long(L)
Java:整数的范围与Java代码所在机器无关
Java中整数类型的三种表示形式:
十进制整数:如,2,-6;
八进制整数:以0开头,如02;
十六进制整数:以0x开头,如Ox5317
注意:这里没有二进制!!!
(2)字符类型
用‘’表示字符常量
char c1 = ‘a’; char c2 = ‘人’
char :16位;使用Unicode编码
可用十六进制编码形式表示
5317 4EAC 6B22 8FCE 4F60 (16进制)
使用‘\’将其后的字符转换成其他含义
‘\n’表示回车;
‘\u5317’代表编码为5317 (16进制)的字符:‘北’
System.out.print('\u5317'); System.out.print('\u4eaC'); System.out.print('\u6B22'); System.out.print('\u8FCE'); System.out.print('\u4F60'); //输出:北京欢迎你
区分字符和字符串
(3)浮点类型
Java中的实数类型 float(4字节)、double(8字节,双精度)
两种表示方法:
十进制形式 如3.14,.314 314.0
科学计数法,如:5e-3F
默认为double型,若声明一个float型,需要在数字后面加上f或F
double a = 12.3; float f = 12.3f;
float f = 12.3; System.out.println(f);//错误!提示精度缺失! //java中12.3默认我double类型。将其赋值给float类型的变量f,可能造成ing度缺失,所以报错!!! double pi = 3.1415926; int p = (int)pi; System.out.println(p);//p=3
注意:计算机中无法精确表示实数
(4)布尔类型 boolean
用于判断逻辑,包含:false和true
注意:只能取true和false,不能以0或非0整数来代替
(5)基本类型数据之间的转换
<1>类型的兼容转换
float f = 1.0f; double d = f;
<2>强制类型转换: (类型指示符)表达式
double pi = 3.1415926; int p = (int)pi;//p=3
转换规则:
基本数据类型转换规则小结
容量小的转换成容量大的(隐式的自动转换)
byte short char->int->long->float->double
byte short char互相之间不转换,用时全部转换成int类型
容量大的类型转换成容量小的类型时,要加强制转换符,但可能降低精度或造成溢出
多种类型混合运算时,系统自动将所有类型转换成容量最大的类型,再进行计算
对于一个整数,编译器当作int型(默认)
对于一个小数,编译器当作double型(默认)
boolean类型和其他类型不能互相转换
数据类型大小、范围、默认值如下:
数据类型 大小(位) 范围 默认值
byte(字节) 8 -128 - 127 0
shot(短整型) 16 -32768 - 32768 0
int(整型) 32 -2147483648-2147483648 0
long(长整型) 64 -9233372036854477808-9233372036854477808 0
float(浮点型) 32 -3.40292347E+38-3.40292347E+38 0.0f
double(双精度) 64 -1.79769313486231570E+308-1.79769313486231570E+308 0.0d
char(字符型) 16 ‘ \u0000 - u\ffff ’ ‘\u0000 ’ 使用的Unicode值 表示的,格式是‘\uXXXX’。XXXX表示一个十六进制的整数。如:‘A’、‘9’、‘0’等。
boolean(布尔型) 1 true/false false
实例:
int i1 = 123; int i2 = 456; double d1 = (i1+i2)*1.2;//系统将转换为double型运算 float f1 = (float)((i1+i2)*1.2);//需要加强制转换符 byte b1 = 1; //整形常量赋值且未超出范围,可以直接赋值 byte b2 = 2;//整形常量赋值且未超出范围,可以直接赋值 byte b3 = b1+b2;//错误!!!!系统将转换为int型运算,需要强制转换符改为(byte) (b1+b2); System.out.println(b3); double d2 = 1e200; float f2 = (float)d2;//会产生溢出 System.out.println(f2);
float f3 = 1.23;//错误!!!要换成1.23f long l1 = 123; long l2 = 30000000000;//错误!!!数制超出了int的范围,必须加L float f = l1+l2+f3;//系统将转换为float型计算 long l = (long)f;//强制转换会舍去小数部分(不是四舍五入)
原码+补码+反码
原码:本身的值。
原码符号位不变->其他位取反,得到反码->再加1 得到补码。
补码减1,得到反码->反码符号位不变,其他位按位取反 ->得到原码。
需要注意的事项:
double d1=1/3;//这里d1的值是0
1/3是两个整数相除,首先做的是整数运算,结果是0。直接赋给d1,所以d1=0;
需要做如下修改就可以:
public class Test { public static void main(String[] args) { double d1=1/3;
System.out.println(d1); double d2=1/3d; System.out.println(d2); } }
结果: