Rust和Java都是一种静态类型的语言。这意味着它必须在编译期知道所有变量的类型。
整形
Rust
长度 | 有符号类型 | 无符号类型 |
---|---|---|
8bit | i8 | u8 |
16bit | i16 | u16 |
32bit | i32 | u32 |
64bit | i64 | u64 |
128bit | i128 | u128 |
arch | isize | usize |
Java
长度 | 有符号类型 | 无符号类型 |
---|---|---|
8 | byte | byte |
16 | short | short |
32 | int | int |
64 | long | long |
java没有在类型表达上区分有符号或者无符号类型。但是可以使用对应的引用类型调用无符号的操作。例如:Integer的Static methods like compareUnsigned, divideUnsigned。
数字范围
有符号类型规定的数字范围是
~
。
无符号类型可以存储的数字范围是0 ~
。
重要问题--整型溢出
比方说有一个
u8
,它可以存放从 0 到 255 的值。那么当你将其修改为范围之外的值,比如 256,则会发生整型溢出(integer overflow)。大于该类型最大值的数值会被“包裹”成该类型能够支持的对应数字的最小值。比如在
u8
的情况下,256 变成 0,257 变成 1,129会变成-127,依此类推。程序不会 panic,但是该变量的值可能不是你期望的值。依赖整型溢出包裹的行为不是一种正确的做法。
浮点型
Rust
f32:32位单精度浮点型
f64:64位双精度浮点型
Java
float:32位单精度浮点型
double:64位双精度浮点型
都按照 IEEE-754 标准表示。
Java中不建议使用float和double表示精确值,例如货币。可以使用java.math.BigDecimal。
布尔型
Rust
布尔类型有两个可能的值:true
和 false
。布尔值的大小为 1 个字节。
Java
布尔类型有两个可能的值:true
和 false
。使用1bit存储,长度不固定。JVM 会在编 译时期将 boolean 类型的数据转换为 int,使⽤ 1 来表示 true,0 表示 false。JVM ⽀持 boolean 数组, 但是是通过读写 byte 数组来实现的。
字符型
Rust
char:char
(字符)类型是该语言最基本的字母类型。
声明的 char
字面量采用单引号括起来,这与字符串字面量不同,字符串字面量是用双引号括起来。
Rust 的字符类型大小为 4 个字节,表示的是一个 Unicode 标量值。
Java
char:char 数据类型是单个 16 位 Unicode 字符。
Unicode 值的范围为
U+0000
~U+D7FF
和U+E000
~U+10FFFF
。Java中可以直接使用数字值。
Rust举例:
let string1 = String::from("abcd");
for ele in string1.chars() {
if ele > 'a' && ele < 'z' {
println!("{}", ele)
}
}
Java举例:
String he = "Hello";
for (char c1 : he.toCharArray()) {
if (c1 > 'a' && c1 < 'z') {
System.out.println(c1);
}
}
可以看出,基本数据方面,Rust和Java还是很相似的。
网友评论