leisurely8rust


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!(&amp;quot;abc (f32)&amp;quot;); println!(&amp;quot; 0.1 + 0.2: {:x}&amp;quot;, (abc.0 + abc.1).to_bits()); println!(&amp;quot; 0.3: {:x}&amp;quot;, (abc.2).to_bits()); println!(); println!(&amp;quot;xyz (f64)&amp;quot;); println!(&amp;quot; 0.1 + 0.2: {:x}&amp;quot;, (xyz.0 + xyz.1).to_bits()); println!(&amp;quot; 0.3: {:x}&amp;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!(&amp;quot;未定义的数学行为&amp;quot;) } }</code></pre> <h2>3、字符</h2> <p>1、Rust 的字符不仅仅是 ASCII,所有的 Unicode 值都可以作为 Rust 字符 2、Rust 的字符只能用 &#039;&#039; 来表示, &quot;&quot; 是留给字符串的。</p> <pre><code>fn main() { let c = &amp;#039;z&amp;#039;; let z = &amp;#039;ℤ&amp;#039;; let g = &amp;#039;国&amp;#039;; let heart_eyed_cat = &amp;#039;😻&amp;#039;; }</code></pre> <p>2、由于 Unicode 都是 4 个字节编码,因此字符类型也是占用 4 个字节:</p> <pre><code>fn main() { let x = &amp;#039;中&amp;#039;; println!(&amp;quot;字符&amp;#039;中&amp;#039;占用了{}字节的内存大小&amp;quot;,std::mem::size_of_val(&amp;amp;x)); } 输出: $ cargo run Compiling ... 字符&amp;#039;中&amp;#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!(&amp;quot;{}&amp;quot;,&amp;quot;true&amp;quot;); } } </code></pre> <h2>5、单元类型()</h2> <p>无返回值,占位符</p> <pre><code>macro_rules! println { () =&amp;gt; { $crate::print!(&amp;quot;\n&amp;quot;) }; ($($arg:tt)*) =&amp;gt; {{ $crate::io::_print($crate::format_args_nl!($($arg)*)); }}; }</code></pre>

页面列表

ITEM_HTML