練習題來自https://practice-zh.course.rs/basic-types/numbers.html
1
// 移除某個部分讓代碼工作
fn main() {let x: i32 = 5;let mut y: u32 = 5;y = x;let z = 10; // 這里 z 的類型是?
}
y的類型不對,另外,數字的默認類型是i32
fn main() {let x: i32 = 5;let mut y: i32 = 5;y = x;let z = 10; // 這里 z 的類型是 i32
}
2
// 填空
fn main() {let v: u16 = 38_u8 as __;
}
同理,這里的__應該是u16,以最后確定的類型為準
3 如果我們沒有顯式的給予變量一個類型,那編譯器會自動幫我們推導一個類型
// 修改 `assert_eq!` 讓代碼工作
fn main() {let x = 5;assert_eq!("u32".to_string(), type_of(&x));
}// 以下函數可以獲取傳入參數的類型,并返回類型的字符串形式,例如 "i8", "u8", "i32", "u32"
fn type_of<T>(_: &T) -> String {format!("{}", std::any::type_name::<T>())
}
數字類型默認推導為i32,這里改為i32即可。
// 修改 `assert_eq!` 讓代碼工作
fn main() {let x = 5;assert_eq!("i32".to_string(), type_of(&x));
}
4
// 填空,讓代碼工作
fn main() {assert_eq!(i8::MAX, __); assert_eq!(u8::MAX, __);
}
8位有符號數,一位表示為符號,最大值即為2^7-1
;無符號數就是2^8-1
// 填空,讓代碼工作
fn main() {assert_eq!(i8::MAX, 127); assert_eq!(u8::MAX, 255);
}
5
// 解決代碼中的錯誤和 `panic`
fn main() {let v1 = 251_u8 + 8;let v2 = i8::checked_add(251, 8).unwrap();println!("{},{}",v1,v2);
}
251+8
會超過u8
的上限,同樣,251
本身也不是一個合法的i8
值,rust默認不允許溢出,全部改成u16/i16即可。
// 解決代碼中的錯誤和 `panic`
fn main() {let v1 = 251_u16 + 8;let v2 = i16::checked_add(251, 8).unwrap();println!("{},{}",v1,v2);
}
6
// 修改 `assert!` 讓代碼工作
fn main() {let v = 1_024 + 0xff + 0o77 + 0b1111_1111;assert!(v == 1579);
}
轉換成十進制實際上是1024+(1615+115)+(78+71)+… = 1597
// 修改 `assert!` 讓代碼工作
fn main() {let v = 1_024 + 0xff + 0o77 + 0b1111_1111;assert!(v == 1597);
}
7
// 將 ? 替換成你的答案
fn main() {let x = 1_000.000_1; // ?let y: f32 = 0.12; // f32let z = 0.01_f64; // f64
}
默認的浮點數類型為f32
,這里填寫即可。
8
fn main() {assert!(0.1+0.2==0.3);
}
說是用兩種方法,我覺得有意義的只有一種。
fn main() {assert!((0.1_f64 + 0.2 - 0.3).abs() < 0.00001);
}
9 🌟🌟 兩個目標: 1. 修改 assert! 讓它工作 2. 讓 println! 輸出: 97 - 122
fn main() {let mut sum = 0;for i in -3..2 {sum += i}assert!(sum == -3);for c in 'a'..='z' {println!("{}",c);}
}
第一個是左閉右開區間,改成左閉右閉就行;第二個需要轉換,從字符轉成u8
,不過不能像C++
一樣直接輸出。
fn main() {let mut sum = 0;for i in -3..=2 {sum += i}assert!(sum == -3);for c in 'a'..='z' {println!("{}",c as u8);}
}
10
// 填空
use std::ops::{Range, RangeInclusive};
fn main() {assert_eq!((1..__), Range{ start: 1, end: 5 });assert_eq!((1..__), RangeInclusive::new(1, 5));
}
這個知識點前面也沒有講過。
首先形如(x..y)
的左閉右開區間,默認推導為range
,所以第一個右邊為5;而形如(x..=y)
的左閉右閉,默認推導為RangeInclusive
,所以右邊填=5
// 填空
use std::ops::{Range, RangeInclusive};
fn main() {assert_eq!((1..5), Range{ start: 1, end: 5 });assert_eq!((1..=5), RangeInclusive::new(1, 5));
}
11
// 填空,并解決錯誤
fn main() {// 整數加法assert!(1u32 + 2 == __);// 整數減法assert!(1i32 - 2 == __);assert!(1u8 - 2 == -1);assert!(3 * 50 == __);assert!(9.6 / 3.2 == 3.0); // error ! 修改它讓代碼工作assert!(24 % 5 == __);// 邏輯與或非操作assert!(true && false == __);assert!(true || false == __);assert!(!true == __);// 位操作println!("0011 AND 0101 is {:04b}", 0b0011u32 & 0b0101);println!("0011 OR 0101 is {:04b}", 0b0011u32 | 0b0101);println!("0011 XOR 0101 is {:04b}", 0b0011u32 ^ 0b0101);println!("1 << 5 is {}", 1u32 << 5);println!("0x80 >> 2 is 0x{:x}", 0x80u32 >> 2);
}
fn main() {// Integer additionassert!(1u32 + 2 == 3);// Integer subtractionassert!(1i32 - 2 == -1);assert!(1i8 - 2 == -1);assert!(3 * 50 == 150);assert!(9 / 3 == 3); // error ! make it workassert!(24 % 5 == 4);// Short-circuiting boolean logicassert!(true && false == false);assert!(true || false == true);assert!(!true == false);// Bitwise operationsprintln!("0011 AND 0101 is {:04b}", 0b0011u32 & 0b0101);println!("0011 OR 0101 is {:04b}", 0b0011u32 | 0b0101);println!("0011 XOR 0101 is {:04b}", 0b0011u32 ^ 0b0101);println!("1 << 5 is {}", 1u32 << 5);println!("0x80 >> 2 is 0x{:x}", 0x80u32 >> 2);
}