【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);
}

相关推荐

  1. Rust练习2.数值类型

    2024-07-16 05:08:03       26 阅读
  2. 3.Rust数据类型

    2024-07-16 05:08:03       34 阅读
  3. Rust - 数据类型

    2024-07-16 05:08:03       32 阅读
  4. Rust-10-数据类型

    2024-07-16 05:08:03       23 阅读
  5. Rust基本数据类型-字符串

    2024-07-16 05:08:03       32 阅读
  6. Rust入门篇:数据类型

    2024-07-16 05:08:03       111 阅读
  7. Rust 实战练习 - 2. OS,IO,Platform(注册表,/etc)

    2024-07-16 05:08:03       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 05:08:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 05:08:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 05:08:03       58 阅读
  4. Python语言-面向对象

    2024-07-16 05:08:03       69 阅读

热门阅读

  1. Go语言 切片slice

    2024-07-16 05:08:03       24 阅读
  2. Go语言 字符串和数组

    2024-07-16 05:08:03       24 阅读
  3. 分享一个无损AI图片放大【非网页,PC端】

    2024-07-16 05:08:03       24 阅读
  4. centos5离线安装git

    2024-07-16 05:08:03       28 阅读
  5. 跨域的解决方案

    2024-07-16 05:08:03       28 阅读
  6. Jenkins教程-20-常用插件-Parameterized Trigger

    2024-07-16 05:08:03       22 阅读
  7. Go中的defer看似很简单,实则一点都不难

    2024-07-16 05:08:03       23 阅读