基于我们对C++的了解,下面只讲解Java语言部分独特的变量数据与运算符特性。
在 Java
中, 一个 int
变量占4
个字节. 和操作系统没有直接关系
- 什么是字节?
- 字节是计算机中表示空间大小的基本单位.
计算机使用二进制表示数据. 我们认为 8 个二进制位(bit) 为一个字节(Byte).
平时的计算机为 8GB 内存, 意思是 8G 个字节.
其中 1KB = 1024 Byte, 1MB = 1024 KB, 1GB = 1024 MB.
所以 8GB 相当于 80 多亿个字节.- 4 个字节表示的数据范围是 -2^31 -> 2^31-1 , 也就约是 -21亿 到 +21亿.
使用以下代码查看 Java 中的整型数据范围:
如果运算的结果超出了 int
的最大范围, 就会出现溢出的情况,21
亿这样的数字对于当前的大数据时代来说, 是很容易超出的. 针对这种情况, 我们就需要使用更大范围的数据类型来表示了. Java 中提供了 long
类型.
class Test{
public static void main(String[] args){
int max = Integer.MAX_VALUE + 1;
int min = Integer.MIN_VALUE - 1;
long maxL = (long)Integer.MAX_VALUE + 1;
long minL = (long)Integer.MIN_VALUE - 1;
System.out.println(Integer.MAX_VALUE + " " + Integer.MIN_VALUE);
System.out.println(max + " " + min);
System.out.println(maxL + " " + minL);
}
}
输出结果:
2147483647 -2147483648
-2147483648 2147483647
2147483648 -2147483649
分析:
int
类型数据的最大与最小的表示范围。int
类型数据溢出之后的表示值,上限加一变为下限,下限减一变为上限。int
类型的上下限加一或减一仍为int
型数据,未发生整型提升。所以将它强制转换为long
类型数据且用long
进行接收,如愿获得比上限大一的数据,下限亦然,因为long
类型数据的表示范围广于int
类型。长整型变量(long)注意事项:
10L
, 表示一个长整型的数字. 10l
也可以.再看看long
类型的范围:
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
输出结果:
9223372036854775807
-9223372036854775808
这个数据范围远超过 int
的表示范围,足够绝大部分的工程场景中使用。
Java 中使用 单引号 + 单个字母
的形式表示字符字面值。如char ch = 'A';
计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII
表示字符, 而 Java 中使用 Unicode
表示字符。
因此一个字符占用2
个字节, 表示的字符种类更多, 包括中文。
char ch = '陆';
System.out.println(ch);
执行 javac 的时候可能出现以下错误:
Test.java:3: 错误: 未结束的字符文字
char ch = '鍛?';
^
这是因为编译涉及编码问题,此时我们在执行 javac 时加上 -encoding UTF-8
选项即可,表示用UTF-8
的编码格式进行编译,可以正常输出。
javac -encoding UTF-8 Test.java
在 Java 中, int
除以int
的值仍然是 int
(会直接舍弃小数部分)。
Java 中的 double
虽然也是 8
个字节, 但是**浮点数的内存布局和整数差别很大, **不能单纯的用 2 ^ n 的形式表示数据范围。
Java 的 double 类型的内存布局遵守 IEEE 754
标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差。
举例:
double num = 1.1;
System.out.println(num * num);
// 执行结果
1.2100000000000002
Java独特的数据类型,其基本语法格式为:
byte 变量名 = 初始值;
代码示例:
byte value = 0;
System.out.println(value);
注意事项:
1
个字节, 表示范围较小 ( -128 ~ +127
)不同于C++中变量是否为0
/NULL
等的判断方式,Java中只可以由boolean
类型变量判断,其基本语法格式为:
boolean 变量名 = 初始值;
代码示例:
boolean value = true;
System.out.println(value);
注意事项:
boolean
类型的变量只有两种取值, true
表示真, false
表示假。1个 字节
, 有些是占1个 比特位
, 这个没有明确规定。boolean
类型和int
不能相互转换, 不存在像C/C++中 1
表示 true
, 0
表示 false
这样的用法。boolean value = true;
System.out.println(value + 1);
// 代码编译会出现如下错误:
Test.java:4: 错误: 二元运算符 '+' 的操作数类型错误
System.out.println(value + 1);
^
第一个类型: boolean
第二个类型: int
1 个错误
硬性指标:
软性指标:
在短路求值中我们会遇到类似于10 / 0
之类的运算, 因为涉及除零的操作会涉及到Java中的异常机制,导致程序抛出异常,此体系之后讲解,目前仅作知悉。
意为无符号右移 。
>>>
: 最右侧位不要了, 最左侧补 0.
int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
// 运行结果(按十六进制打印的)
7fffffff
Java 中的取余不仅针对与int
类型数据,double
类型也同样可以使用。
System.out.println(11.5 % 2.0);
// 运行结果
1.5
%
操作在 Java 中也能针对 double
来计算。boolean
。整体来看, Java 的运算符的基本规则和 C 语言基本一致,记住一些常见的特殊点即可常规使用。