03.数据类型
<h1>02.数据类型</h1>
<h2>1、整型</h2>
<p>byte
short
int
long</p>
<pre><code>长度 有符号类型 无符号类型
8 位 i8 u8
16 位 i16 u16
32 位 i32 u32
64 位 i64 u64
128 位 i128 u128
视架构而定 isize usize
</code></pre>
<h2>2、浮点型</h2>
<p>float
double</p>
<pre><code>两种类型:
f32类型:相当于float
f64类型:相当于double
两个陷阱:
陷阱1:避免在浮点数上测试相等性
fn main() {
assert_eq!(0.1 + 0.2, 0.3);
}
/*
error:两边精度不一致
assertion `left == right` failed
left: 0.30000000000000004
right: 0.3
*/
fn main() {
let abc: (f32, f32, f32) = (0.1, 0.2, 0.3);
let xyz: (f64, f64, f64) = (0.1, 0.2, 0.3);
println!(&quot;abc (f32)&quot;);
println!(&quot; 0.1 + 0.2: {:x}&quot;, (abc.0 + abc.1).to_bits());
println!(&quot; 0.3: {:x}&quot;, (abc.2).to_bits());
println!();
println!(&quot;xyz (f64)&quot;);
println!(&quot; 0.1 + 0.2: {:x}&quot;, (xyz.0 + xyz.1).to_bits());
println!(&quot; 0.3: {:x}&quot;, (xyz.2).to_bits());
println!();
assert!(abc.0 + abc.1 == abc.2);
assert!(xyz.0 + xyz.1 == xyz.2);
}
/***
结果:
1、f32运算:两边相等
1、f64运算:一个是3fd3333333333334,一个是3fd3333333333333,两边不一致,f64精度更高
abc (f32)
0.1 + 0.2: 3e99999a
0.3: 3e99999a
xyz (f64)
0.1 + 0.2: 3fd3333333333334
0.3: 3fd3333333333333
*/
陷阱2:当结果在数学上可能存在未定义时,需要格外的小心
1、例如对负数取平方根 -42.1.sqrt(),会返回NaN
2、NaN 不能用来比较,下面的代码会崩溃
fn main() {
let x = (-42.0_f32).sqrt();
assert_eq!(x, x);
}
3、可以使用 is_nan() 等方法,可以用来判断一个数值是否是 NaN
fn main() {
let x = (-42.0_f32).sqrt();
if x.is_nan() {
println!(&quot;未定义的数学行为&quot;)
}
}</code></pre>
<h2>3、字符</h2>
<p>1、Rust 的字符不仅仅是 ASCII,所有的 Unicode 值都可以作为 Rust 字符
2、Rust 的字符只能用 '' 来表示, "" 是留给字符串的。</p>
<pre><code>fn main() {
let c = &#039;z&#039;;
let z = &#039;ℤ&#039;;
let g = &#039;国&#039;;
let heart_eyed_cat = &#039;😻&#039;;
}</code></pre>
<p>2、由于 Unicode 都是 4 个字节编码,因此字符类型也是占用 4 个字节:</p>
<pre><code>fn main() {
let x = &#039;中&#039;;
println!(&quot;字符&#039;中&#039;占用了{}字节的内存大小&quot;,std::mem::size_of_val(&amp;x));
}
输出:
$ cargo run
Compiling ...
字符&#039;中&#039;占用了4字节的内存大小</code></pre>
<h2>4、Bool布尔</h2>
<p>ust 中的布尔类型有两个可能的值:true 和 false,布尔值占用内存的大小为 1 个字节:</p>
<pre><code>fn main() {
let b:bool = true;
if b == true {
println!(&quot;{}&quot;,&quot;true&quot;);
}
}
</code></pre>
<h2>5、单元类型()</h2>
<p>无返回值,占位符</p>
<pre><code>macro_rules! println {
() =&gt; {
$crate::print!(&quot;\n&quot;)
};
($($arg:tt)*) =&gt; {{
$crate::io::_print($crate::format_args_nl!($($arg)*));
}};
}</code></pre>