【Rust练习】2.数值类型
练习题来自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; // f32
let 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 addition
assert!(1u32 + 2 == 3);
// Integer subtraction
assert!(1i32 - 2 == -1);
assert!(1i8 - 2 == -1);
assert!(3 * 50 == 150);
assert!(9 / 3 == 3); // error ! make it work
assert!(24 % 5 == 4);
// Short-circuiting boolean logic
assert!(true && false == false);
assert!(true || false == true);
assert!(!true == false);
// Bitwise operations
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);
}
原文地址:https://blog.csdn.net/qq_37387199/article/details/140217411
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!