1、变量:在程序的执行过程中,其值可以发生改变的量叫变量。
定义变量的格式:
(1)、数据类型 变量名 = 初始化值;
(2)、数据类型 变量名;
变量名 = 初始化值;
2、 数据类型:
基本数据类型
(一个字节有8位)
整数类型 占用字节数 可表示的范围
byte 1 -2^7 ~ 2^7-1
short 2 -2^15 ~ 2^15-1
int 4 -2^31 ~ 2^31-1
long 8 -2^63 ~ 2^63-1
浮点类型
float 4 -3.403*10^38 ~ 3.403*10^38
double 8 -1.798*10^308 ~ 1.798*10^308
字符型
char 2
布尔型
boolean 1
引用数据类型(学习面向对象时再说)
注意事项:
1、整数默认是int类型
2、如果要定义一个long类型的数据,末尾要加上L或者l,推荐L
3、小数默认是double类型
4、如果要定义一个float类型的数据,末尾要加上F或者f,推荐F
3、自动类型转换:
byte,short,char在参与运算的时候会自动提升到int类型
由大的数据类型接收小的数据类型,会自动转换,不会报错。( byte,short,char—int—long—float—double)
强制类型转换
由小的数据类型接收大的数据类型,会报错,接收不了,这时候需要强制类型转换
格式:目标数据类型 目标变量名 = (目标数据类型)要转换的数值/变量
eg : byte b1 = (byte) a;
package com.shujia.wxl.day03
/*
byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
有问题的,因为byte数据类型的范围是在-128~127之间,而130超出了范围。
*/
public class DataTypeDemo5 {
public static void main(String[] args) {
// byte b = 130;
byte b = (byte)130;
System.out.println(b); // -126
b = (byte)131;
System.out.println(b);
byte b1 = (byte)300;
System.out.println(b1); // 44
}
}
/*
我们知道数据在计算机种运算的时候是采用补码的形式参数运算的,所以要知道130的补码
而想要知道补码,就得知道反码,原码,所以得求出130的二进制的表示:
130的二进制:10000010
由于整数默认是int类型,所以扩大字节
130的原码为:00000000 00000000 00000000 10000010
又由于最高位是0,所以它的原码,反码,补码都一样
130的补码:00000000 00000000 00000000 10000010
做截取操作:10000010 这是补码
已知补码,求原码:
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
最终结果为:11111110
将它换算成十进制就是我们看到的结果:-126
*/
300的二进制:00000000 00000000 00000001 00101100
300的原码为: 1 00101100
最高位是0,所以原码,反码,补码都一样
300的补码为:00000000 00000000 00000001 00101100
做截取操作:00101100(这是补码)
已知补码,求原码:
符号位 数值位
补码: 0 0101100
反码: 0 0101100
原码: 0 0101100
最终结果为:0101100
将它换算成十进制就是我们能看到的结果:44
3、运算符:
(1)算术运算符:+,-,*,/,%,++,–,+(字符串相加)
+号的用法:
1、当加号两边都是数字或者是数字和字符的时候,这时候的+号做的是加法运算
2、当加号两边其中是字符串的时候,做的是字符串拼接,拼接后是一个新的字符串
3、字符串与任何数值做加法,做的是字符串拼接,拼接后是一个新的字符串
++:自加1
当++在前的时候,先自加1,再做赋值操作,当++在后的时候,先做赋值操作,再做自加1
–:自减1
当–在前的时候,先自减1,再做赋值操作,
当–在后的时候,先做赋值操作,再做自减
int a = 10;
int b = 10;
int c = 10;
a = b++; // a=10 ,b=11 ,c=10
c = --a; // a=9 ,b=11 ,c=9
b = ++a; // a=10 ,b=10 ,c=9
a = c--; // a=9 ,b=10 ,c=8
(2) 赋值运算符:=,+=,-=,*=,/=,%=
short s=1, s = s+1;
short s=1, s += 1;
上面两个代码有没有问题,如果有,那里有问题
第一个有问题,因为变量参与运算,首先会提升数据类型,然后做运算。所以 s = s+1;s会提升到int类型然后再做加法运算,最终的结果是int类型,所以拿short类型接收会报错,所以要想成功赋值,就得强制类型转换。
第二个代码没有问题,是因为内部自动包含了强制类型转换,
s+=1 => s = (s的数据类型)(s+1)
(3) 比较运算符:,>,<,>=,<=,!=
注意事项:
1、关系运算符的表达式的结果是一个boolean类型,要么是true,要么是false
2、==不能少写,一个=是赋值运算符,==才是关系运算符
3、赋值的时候要注意类型问题,关系运算符表达式的结果是boolean类型,所以接收的时候只能是boolean类型的变量接收
(4)逻辑运算符:&,|,^,!,&&,||
逻辑运算符的两边放的是boolean类型的值,计算的结果也是一个boolean类型的值
&: 参与运算的时候,两边有false,则false,两边都做运算
|: 参与运算的时候,两边有true,则true,两边都做运算
^: 参与运算的时候,相同为false,不同为true,两边都做运算
!: 将true变成false,false变成true
(5) 位运算符:&,|,^,~,<<,>>,>>>
<<: 左移,二进制左移,右边用0补齐,多出来的丢弃
>>: 右移,最左边最高位是0用0补齐,最高位是1就用1补齐,多出来的丢弃。
>>>: 无符号右移,无论左边最高是0还是1,都用0补齐,多出来的丢弃。
<<: 左移,二进制左移,右边用0补齐
3的二进制:00000000 00000000 00000000 00000011
由于3是正数,所以原码,反码,补码都一样
3的补码:00000000 00000000 00000000 00000011
左移:
00000000 00000000 00000000 00000011
(00)00000000 00000000 00000000 00001100 (补码)
由于最高位是0,既是补码也是原码,所以结果是: 12
================================================================
>>: 右移,最左边最高位是0用0补齐,最高位是1就用1补齐,多出来的丢弃。
24的二进制:00000000 00000000 00000000 00011000
由于24是正数,所以原码,反码,补码都一样
24的补码:00000000 00000000 00000000 00011000
右移:
00000000 00000000 00000000 00011000
0000000000 00000000 00000000 000110(00) (补码)
由于最高位是0,既是补码也是原码,所以结果是:6
================================================================
>>: 右移,最左边最高位是0用0补齐,最高位是1就用1补齐,多出来的丢弃。
-24的二进制:10000000 00000000 00000000 00011000
已知原码求补码:
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
右移:
11111111 11111111 11111111 11101000
1111111111 11111111 11111111 111010(00) (补码)
已知补码求原码:
补码:11111111 11111111 11111111 11111010
反码:11111111 11111111 11111111 11111001
原码:10000000 00000000 00000000 00000110
最终结果是:-6
==============================================================
>>>: 无符号右移,无论左边最高是0还是1,都用0补齐,多出来的丢弃。
-24的二进制:10000000 00000000 00000000 00011000
已知原码求补码:
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
无符号右移2位:
11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00) (补码)
由于最高位是0,所以它的原码,反码,补码都是一样的。
最终结果位:0011111111 11111111 11111111 111010 = 1073741818
(6)三目运算符:(关系表达式)?表达式1:表达式2;
三目运算符:又称之为三元运算符
格式:(关系表达式)?表达式1:表达式2;
如果关系表达式的结果为true,运算后的结果是表达式1;
如果关系表达式的结果为false,运算后的结果是表达式2;
注意事项:
1、三目运算符表达式的结果数据类型由三目运算符表达式1和表达式2中最大的数据类型决定的。
2、关系表达式一定只能是boolean类型