JAVA基础(三)
--变量和运算符
一、数据的类型
Java的基本数据类型有四种:
整数类型、小数(浮点)类型、布尔类型、字符类型。
二、整数类型
当有变量被定义时,就会被分配到内存中去。比如int a=4;内存中就有一块地方,用来存放a的值。那值具体是多大的地方用来存放a呢?这就跟整数的类型有关了。
Byte 占一个字节 表示的范围-128~127 即-2^7~2^7-1
Short 占两个字节 表示的范围-32768到32767 即-2^15~2^15-1
Int 占四个字节 表示的范围-2147483648到2147483647 即-2^31~2^31-1
Long 占八个字节 表示的范围-2^255~2^255-1
为什么占n个字节表示的范围就是从-2^(8n-1)到2^(8n-1)-1呢?
其实在电脑中,一个字节有八位,一位代表一个数,采用二进制。比如
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
就代表1.
最高位为符号位,0代表正数,1代表负数。
那一个字节能代表的最低的数自然是
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
-127
同理能代表的最大的数为
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
127
那为什么最小的是-128呢?
因为+0和-0的表示重复了,
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
显然都表示0,所以就规定用+0来代表0,而-0代表-128,这样规定使补码的运算也刚好吻合,所以byte的表示范围就是-128~127,因此byte a=-128不报错而byte a=128报错。
同理可得各个整数类型的范围。
三、小数(浮点)类型
单精度浮点数(float)与双精度浮点数(double)的区别如下:
(1)在内存中占有的字节数不同
单精度浮点数在机内占4个字节
双精度浮点数在机内占8个字节
(2)有效数字位数不同
单精度浮点数有效数字8位
双精度浮点数有效数字16位
(3)所能表示数的范围不同
单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38
双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308
一般只要记住它俩都是表示小数且double表示得更精确就行。
四、布尔类型
Boolean可以表示true或者false。
例Boolean a=false;
五、字符类型
例如char a=’a’;char a=’嗨’;都是可以的。
char只能存放一个字符,char a=’aa’;会报错。
char 在Java中是2个字节。java采用unicode,2个字节(16位)来表示一个字符。
值得一提得是,char和int可以根据ascII表进行转换
我们可以int a=’a’;也可以char a=97;此时int的a就为’a’所对应的ascII的的值。同理char的a就是值为97的ascII字符。
同理char a=’a’+1;int b=’a’+’b’;这些操作都是可以的。
总之一句话,需要哪个类型的它就会转成哪个类型的,不过注意ascII码表的范围是0~127。
六、变量详解
1.定义变量:int a;这就是定义变量。
2.初始化变量:int a=45;这就是初始化变量。
3.给变量赋值:比如你先定义了变量int a;之后的a=45;就是给变量赋值。
4.当变量被定义的时候,就已经分配内存了。
5.一般未被赋值的变量直接被使用会报错(如果能,存放的也是垃圾值,也就是随机值)。
6.数据类型转换(精度排序byte<short<int<long<float<double):
数据会自动地从低精度转换到高精度(float a=1;可以输出a=1.0)。
数据无法从高精度转换到低精度(int a=6.5;将会报错),从高精度到低精度转换需要强转int a=(int)6.5;此时会损失精度,即此时a=6;(向下取整)
Java中默认情况下小数是double类型,float a=3.4;会报错,因为double无法往低精度的float转换,我们可以强转float a=(float)3.4;也可以使用更快捷的方式float a=3.4f;在后面加个f也是强转的意思。同理可以long a=32545l;反正报错的话后面加个l就好了。也不是所有的数都能加一个字母代表强转,大部分时候我们还是使用括号+变量类型转换。例如int a=(int)(9+6.5+3.66);
七、运算符
1.基本运算符
基本的+-*/运算法则跟数学的一样,先乘除后加减,有括号先算括号里面的。
比如int a=1+3*(4+1);显然a=16;
值得一提的是/号,比如int a=7/4;7/4就会自动被转成int类型了,也就是向下取整等 于1。
%取模(取余)运算符 int c=a%b;表示定义一个变量,值为a/b的余数,小数也可以用取余符号。
2.自增运算符
A++;等同于a=a+1;
++a;也等同于a=a+1;
一般这两个是没有区别的,当你要达到变量+1的效果时,用哪个都可以。
区别一般就是跟等号的优先级了,a++的优先级低于等号而++a的优先级高于等号:
Int a=56;
Int b=a++;
此时a会先把值赋给b再进行自增(最终a=57,b=56)。
若
Int a=56;
Int b=++a;
a将会先自增再把值赋给b(最终a=b=57);
值得一提的是,自增必须保证自增的数是确定的值,int a; int b=a++;不正确。
int a=5; int b=(a++)++;也不正确。因为不确定编译的时候看到(a++)需要自增,而不知道(a++)是哪个确定的值,虽然我们知道可以算出来,但是计算机没那么聪明。
还有就是自减运算,a--;--a;都是可以的,但是没有自乘运算和自除运算。
3.算数运算符
b+=a;表示b=b+a;
B*=a;表示b=b*a;
同理减号除号取模号都可以。
4.关系运算符
用于判断左右两个数的关系
>(大于) <(小于) ==(等于) !=(不等于) >=(大于等于) <=(小于等于)
一般与判断语句放在一起:
如If(a==b) System.out.println(“a等于b”);
值得一提:判断的等于是两个等号,一个等号是表示赋值,我们不能if(A=B),把一个赋值语句放在判断框里是不对的,判断框里需要的是bool类型的东西。
If(true)和if(1+1==2)都是可以的。
5.逻辑运算符
&&与 ||或 !非
int a=1,b=1,c=2;
if(a==1&&b==1) System.out.println("a=1且b=1");
if(a==1||c==1) System.out.println("a=1或者c=1");
if(!(c==1)) System.out.println("c=1本来是不对的,取反之后所以判断框里的内容就 会变成对的");