【Java】特色的变量类型与运算符


基于我们对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)注意事项:

  1. 基本语法格式和创建 int 变量基本一致, 只是把类型修改成 long
  2. 初始化设定的值为 10L , 表示一个长整型的数字. 10l也可以.
  3. Java 中 long 类型占 8 个字节. 表示的数据范围 -2^63 -> 2^63-1

再看看long类型的范围:

System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);

输出结果:

9223372036854775807
-9223372036854775808

这个数据范围远超过 int 的表示范围,足够绝大部分的工程场景中使用。


char 类型特色

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 

double 类型特色

在 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 

字节类型 (byte)

Java独特的数据类型,其基本语法格式为:

byte 变量名 = 初始值;

代码示例:

byte value = 0;
System.out.println(value);

注意事项:

  1. 字节类型表示的也是整数. 只占1个字节, 表示范围较小 ( -128 ~ +127 )
  2. 字节类型和字符类型互不相干。

布尔类型 (boolean)

不同于C++中变量是否为0/NULL等的判断方式,Java中只可以由boolean类型变量判断,其基本语法格式为:

boolean 变量名 = 初始值;

代码示例:

boolean value = true;
System.out.println(value);

注意事项:

  1. boolean 类型的变量只有两种取值, true 表示真, false 表示假。
  2. boolean 类型有些 JVM 的实现是占 1个 字节, 有些是占1个 比特位, 这个没有明确规定
  3. Java 的 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 个错误

变量命名规则

硬性指标:

  1. 一个变量名只能包含数字, 字母, 下划线
  2. 不能以数字开头。
  3. 变量名是大小写敏感。
    注意: 虽然语法上也允许使用中文/美元符($)命名变量, 但是 强烈 不推荐这样做。

软性指标:

  1. 变量命名要具有描述性, 见名知意。
  2. 变量名不宜使用拼音(但是不绝对)。
  3. 变量名的词性推荐使用名词。
  4. Java中独特推荐变量命名为 小驼峰命名法, 当一个变量名由多个单词构成的时候, 除了第一个单词之外, 其他单词首字母都大写

运算符

在短路求值中我们会遇到类似于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 

小结

  1. %操作在 Java 中也能针对 double 来计算。
  2. 由于 Java 是强类型语言, 因此对于类型检查较严格, 因此像 && 之类的运算操作数必须是 boolean

整体来看, Java 的运算符的基本规则和 C 语言基本一致,记住一些常见的特殊点即可常规使用。

发布了197 篇原创文章 · 获赞 304 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章