一、数值类型
(一)进制表示
(1)二进制:以0b开头,0b0111——7
(2)八进制:以0开头,010——8
(3)十六进制:以0x开头,0xB——11
(二)原码、补码、反码(7为例,最高位为符号位,0为正,1为负)
正数 负数
原码 0000 0111 1000 0111
反码 同原码 1111 1000(除符号位外,其余各位反)
补码 同原码 1111 1001(反码+1)
在计算机中,为了运算方便,数据都是以二进制补码形式存在的。CPU只能进行加法,减法是在加法器的基础上完成的。1-1相当于1+(-1)。
一个有符号的数,其他代表数值的范围为-2^(n-1)~[2^(n-1)]-1,n为bit位数
一个无符号数,0~2^(n-1),n为bit位数
(三)JAVA数据类型
byte—1字节,short—2字节, int—4字节, long—8字节,float—4字节,double—8字节
char—2字节
整数类(byte,short,int, long)
数值型
浮点类型(float,double)
基本数据类型 字符型(char)
布尔型(boolean)
数据类型
类(class)
引用数据类型 接口(interface)
数组([ ])
整数变量默认为int型,浮点型变量默认为double型。声明long型数据,若数据超过int的最大值,则必须后接'l'或者'L';声明float类型数据,必须后接'f'或者'F',否则会抛错。
变量必须先初始化再使用。
boolean只能用true、false表示而不能用0、1(这里与C语言不通)。
/*易错例子*/
class Demo
{
public static void main(String[] args)
{
byte b1=3;
byte b2=4;
byte b3=b1+b2;//会报错,因为java编译器编译时无法判断
//两个变量的和是否会超过byte的范围
byte b4=3+4;//不会报错,因为编译器能够判断右侧的常量是否在byte范围内,
//java虚拟机编译的时候会将这句话编译为byte b4=7;
int a=100;
int b=200;
int c=a+b;//这里不会抛错,因为int的范围很大,而byte范围很小,一不小心就会 //出错,所以java对byte这种小单位进行了检查,而对int没有检查。
}
}
二、运算符
(一)逻辑运算符
(1)^ :逻辑异或运算,二元运算符,参与运算的双方同为false,不同为true
(2)&和&&:逻辑与,&不论左边运算为何结果,右边都会继续运算;&&称为短路与,若左边运算为false,则整个表达式结果为false,不再运算右边,直接得false
(3)|和||:逻辑或,|不论左边运算结果是什么,右边都会继续运算;||称为短路或,若左边运算结果为true,则整个表达式值为true,不再运算右边的表达式
(二)位运算
(1)&按位与
(2)|按位或
(3)^按位异或:异或可用于两个变量值互换
int a=3,b=4;
int c=a^b //C=7
int d=c^a //d=c^a=a^b^a=b=4
int e=c^b //e=c^b=a^b^b=a=3
(4)~按位取反(不考虑符号位,每一位都取反,运算后得到的是补码,显示出来的是 原码)
/*使用位移进行乘除运算效率高*/
(5)<<左移:3<<2——3左移2位(后补0),左移一位相当于乘2
(6)>>右移:3>>1——3右移1位(前补0),右移一位相当于除2
/* 面试题*/
short s = 1;
s = s + 1;
会抛错
整数默认是int类型的,s+1运算之后的结果为int型,然后再将这个int型的值赋值给
short型的s,可能 会丢失精度,所以抛错
short s = 1;
s+=1;
不抛错
s+=1可以看成s=(short)s+1, +=运算默认进行强制转换,
所以这样写不会抛错,但是可能会影响结果的正确性
%(取余操作),结果的运算符和左边的数的运算符一致
|
|