Java基础数据类型与运算符

509 阅读7分钟

1. Java基本数据类型

Java是一种强类型预览,必须为每一个变量声明一种类型

类型 意义 取值
boolean 布尔值 true或false
byte 8位有符号整型 -128~127
short 16位有符号整型 -pow(2,15)~pow(2,15)-1
int 32位有符号整型 -pow(2,31)~pow(2,31)-1
long 64位有符号整型 -pow(2,63)~pow(2,63)-1
float 32位浮点数 IEEE754标准单精度浮点数
double 64位浮点数 IEEE754标准双精度浮点数
char 字符型 16位不带符号,Unicode字符

整型

int 数值正好超过20亿

long 赋值时一般在数字后加上 lL

int 类型最常用。但如果表示星球上的居住人数,就需要使用long类型了

整型范围与运行Java代码的机器无关;Java 程序必须保证在所有机器上都能够得到相同的运行结果;在 C 和 C++ 中,intlong 等类型的大小与目标平台相关。

16进制前缀0x0X;8进制前缀0;Java1.7后,2进制前缀0b0B,数字字面量允许加下划线:1000_0000_0000(表示1000亿,更好阅读),编译器会去除这些下划线

Java 没有任何无符号(unsigned) 形式的 intlongshortbyte类型

浮点型

float,直接赋值时必须在数字后加上 fF。有效位数为6-7位

double,赋值时一般在数字后加 dD 。有效位数为15位

表示溢出、出错的三个特殊的浮点数值:正无穷大、负无穷大、NaN(不是一个数字);例如:正数/0 结果为正无穷大,0/0 或负数平方根结果为NaN

常量 Double_INFINITYDouble.FINITYDouble.NaN (以及相应的 Float 类型的常量)分别表示这三个特殊的值, 但在实际应用中很少遇到。

// 判断是否是“非数值”
boolean flag = Double.isNaN(0/0);

浮点数值不适用于无法接受舍入误差的金融计算中,主要 原因是浮点数值采用二进制系统表示, 而在二进制系统中无法精确地表示 0.1;0.1 用二进制表示无线循环,进行舍入,有误差

字符型

char中存储 Unicode 码,用单引号赋值。

有的Unicode可以用一个char值描述,有的需要两个(例如emoji表情,4个字节)

char类型的字面量值要用单引号括起来

char类型的值可以表示为十六进制值,其范围从\u0000\uffff\u表示他后面是一个Unicode编码的字符。但是是十六进制的。

Unicode转义序列会在解析代码之前得到处理。"\u0022+\u0022"会解析为""+"" 也就是一个空串;也要当心注释中的\u ,如

    // Look inside c:\users 

会产生语法错误,因为 \u后面跟了4个16进制数

强烈建议不要在代码中使用char 类型,除非确实需要处理 UTF-16 代码单元

布尔型

boolean - 只有 truefalse 两个取值

整型值与布尔值之间不能互换

2. 基本数据类型的运算

当参与 / 运算的两个 操作数都是整数时, 表示整数除法(结果向下取整);否则, 表示浮点除法。

整数的求余操作(有时称为取模) 用 % 表示;例如,15/2 == 715%2 == 1, 15.0/2 == 7.5

整数被 0 除将会产生一个异常, 而浮点数被 0 除将会得到无穷大或NaN结果

数值类型之间的转换

有6个实心箭头,表示无信息丢失的转换;有3个虚箭头,表示可能有精度损失的转换

例如:

int n = 123456789; 
float f= n;//f is 1.23456792E8 (6-7位有效)

n + fn 是整数,f 是浮点数), 先要将两个操作数转换为同一种类型,然后再进行计算

如果两个操作数中有一个是 double 类型, 另一个操作数就会转换为 double 类型。

否则,如果其中一个操作数是 float 类型,另一个操作数将会转换为 float 类型。

否则, 如果其中一个操作数是 long 类型, 另一个操作数将会转换为 long 类型。

否则, 两个操作数都将被转换为 int 类型。

double是最终的数据类型 :)

byte -> short(char) -> int -> long -> float -> double

强制类型转换

语法:强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名。

double x = 9.97; 
int nx = (int) x; // nx的值为9,通过截断小数部分将浮点值转换为整型

可以利用Math.round() 对浮点数进行舍入运算;四舍五入

如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。

byte a =(byte) 300 // a的实际值为 44。

结合赋值与运算符

x += 4 等价于 x = x + 4;一般要把运算符放在=号左边

如果运算符得到一个值, 其类型与左侧操作数的类型不同, 就会发生强制类型转换。

int x = 1;
x += 3.5; // x为4,等价于 x = (int)(x + 3.5) 

自增、自减运算符

n++/++n 将变量 n 的当前值加 1, n--/--n则将 n 的值减 1 由于这些运算符会改变变量的值,所以它们的操作数不能是数值。4++(这样是错误的) 在表达式中,前缀、后缀有区别

int n = 1;
int a = n ++; // a = 1, n = 2;先进行 a 的运算,再进行 n 的运算;

int n = 1;
int a = ++ n; // a = 2, n = 2;先进行 n 的运算,再进行 a 的运算;

关系和boolean运算符

==, >=, >, <, <=, !=, &&, ||, ?:(三元运算符)

位运算符

处理整型类型时,可以直接对组成整型数值的各个位完成操作;这意味着可以使用掩码技术得到整数中的各个位

& ("and"), | ("or"), ^ ("xor"), ~("not")

还有<<>>运算符将位模式左移或右移 >>> 运算符会用0填充高位,>> 会用符号位填充高位;不存在 <<<

移位运算符的右操作数要完成模 32(4字节) 的运算(除非左操作数是 long 类型, 在这种情 况下需要对右操作数模 64(8字节) )。 例如,1 << 35 的值等同于 1 << 38

位掩码技术:利用 & 并结合使用适当的 2 的幂, 可以把其他位掩掉, 而只保留其中的某一位。 位掩码实例:

/*
 0b00011000(24)
&0b00001000(8) // 0b00000001(1) << 3 -> 0b000001000(8)
=0b00001000(8) // 0b00001000(8) >> 3 -> 0b000000001(1)
原理
x & 0 = 0
x & 1 = x
用0把某一位掩住,用1显示出某一位,再移位
*/
int fourthBitFromRight = (24 & (1 << 3)) >> 3

括号与运算符级别

如果不使用圆括号, 就按照给出的运算符优先级次序进行计算。同一个级别的运算符按照从左到右的次序进行计算(除了表中给出的右结合运算符外)。

例如:a && b || c 等价于 (a && b) || c

参考

juejin.cn/post/684490…

book.douban.com/subject/268…