Rust 中的基本数据类型——Rust语言基础06

2023-05-16

文章目录

  • 1. 前言
  • 2. 标量类型(Scalar)
    • 2.1. 整型(Integer)
    • 2.2. Rust 的整数形式
    • 2.3. 奇怪的问题(整数的溢出)
    • 2.4. 浮点类型(Float)
    • 2.5. 布尔类型(Bool)
    • 2.6. 字符类型(Char)
  • 3. 复合类型
    • 3.1. 元组类型(Tuple)
    • 3.2. 数组类型(Array)
    • 3.3. 数组越界访问
  • 4. 基本运算
  • #附录 1:Rust 中的运算符
  • #附录 2: 二进制补码

1. 前言

Rust 中的每个值都具有特定的数据类型,它告诉 Rust 指定了哪种数据,因此编译器知道如何处理这些数据。下面将研究两种数据类型子集:标量 (scalar) 和复合 (compound)

请记住,Rust 是一种静态类型语言,这将意味着,编译程序时需要让编译器清楚所有变量的类型。而编译器通常也可以根据具体值和代码里如何使用来推测我们声明缺省类型的变量应该使用什么类型。但是当存在多种情况时,则必须在编写过程中注明变量类型,因此注明变量类型将会是一个好习惯。

2. 标量类型(Scalar)

标量 (scalar) 类型只能表示单个值。Rust 中有四种主要的标量类型:整型浮点型布尔型字符型。(这与 C/C++ 的基本类型相同)

2.1. 整型(Integer)

整型则表示一个整数,之前我们已经见过一个整型类型 u32。其中 u 表示该整数是无符号的 (unsigned)。反之有符号的则会以 i 开头。
Rust 中的整数类型:

长度有符号无符号
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize

每种整数类型都分为两类,有符号、无符号,其每种整数类型都具有对应的长度,该长度则会限制了这种类型的可表示数值范围。
[注]:计算机中会以二进制补码的形式存储有符号数,后文的附录中将会详细对其解释。

8-bit 长度来说明问题:
u8 类型的整数由于其不需要考虑符号位,所有位都用来表示具体值,则其可表示的整数范围:[0, 28 - 1];

i8 类型的整数由于需要用最高位表示数据的正负性(最高位为 0 表示正数,为 1 表示负数),则其可表示的整数范围:[-(27), 27 - 1]

依此类推则有:
每个无符号整数可表示的整数范围 [0, 2n - 1]

每个有符号整数可表示的整数范围 [-(2n-1), 2n-1 - 1]

Rust 中有这样的整数类型 usizeisize,它们的长度取决于当前计算机的体系结构,在表格中用 arch 代替表示,如:当前的系统是 32 位架构,它们的长度则是 32 位;若当前系统是 64 位架构,它们的长度则是 64 位。

[注]:Rust 中使用 i32 作为默认的整数类型。————请记住这一点

2.2. Rust 的整数形式

Rust 中允许使用添加特定的字符来更清晰的描述整数数值。Rust 允许数字类型使用特定字符做后缀来指定类型(如,let num: u8 = 28u8;)。也可以在数字中添加下划线 _,可起到视觉分隔作用,是的数字更易阅读。(如,1_000_0000xffff_ffff

整数形式示例
十进制(Decimal)27_149
十六进制(Hex)0xff_ff
八进制(Octal)0o77
二进制(Binary)0b1111_0000
字节(Byte 仅 u8类型)b'A' / b'a'

示例源码如下:

fn main() {

    let dec_num = 27_149;
    let hex_num = 0xaa_bb;
    let oct_num = 0o7_666;
    let bin_num = 0b1_0000;
    let ch: u8 = b'A';		// 字母 A 的 ASCII 码值为 65

    println!("The number of decimal: {dec_num}");
    println!("The number of hex: {hex_num}");
    println!("The number of octal: {oct_num}");
    println!("The number of binary: {bin_num}");
    println!("The character: {ch}");

}

运行结果:

imaginemiracle:variables$ cargo run
   Compiling variables v0.1.0 (/home/imaginemiracle/Miracle/Code/rust_projects/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.20s
     Running `target/debug/variables`
The number of decimal: 27149
The number of hex: 43707
The number of octal: 4022
The number of binary: 16
The character: 65

2.3. 奇怪的问题(整数的溢出)

Boy: 等等,说了这么多就是为了希望我可以正确的为整数赋值是吗?
Girl: 对呀~
Boy: 那万一我记不住,或者我要故意用错会发生什么?
Girl: Enmmm,你想怎么样?
Boy: 呐!我现在是知道了 u8 类型的取值范围是 [0, 28 - 1],那我非要给他赋值 28,或者更大的数呢?
Girl: 啊,你你你……,我也不知道了,那我们试试吧!

让我们就用下面这小段代码来做个小小的实验。

use std::io;

fn main() {

    let mut number = String::new();

    io::stdin()
            .read_line(&mut number)
            .expect("Failed to read line.");

    let number: u8 = number.trim().parse().expect("It's a number.");
    let test_number: u8 = number + 10;


    println!("Input num: {}", number);
    println!("The test num: {}", test_number);
}

练习的过程顺带也回顾一下之前的内容,获取标准输入,并将其转换为整数,再为其加上 10,并打印两个数字。我们先使用常规的 debug 模式来运行。

imaginemiracle:variables$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/variables`
12
Input num: 12
The test num: 22

OK,看起来没什么问题,让我们试着输入 u8 的最大值 255

imaginemiracle:variables$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/variables`
255
thread 'main' panicked at 'attempt to add with overflow', src/main.rs:30:27
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

哇呜!Rust 慌了,不知道它该干什么了。让我们再尝试使用 release 模式运行。

imaginemiracle:variables$ cargo run --release
    Finished release [optimized] target(s) in 0.00s
     Running `target/release/variables`
255
Input num: 255
The test num: 9

咦!这时候会发现 Rust 不慌了,它明白自己在整数溢出的时候该怎么做。

原来 Rust 对于整数的溢出会出现两种处理行为:

Debug模式下:
Rust 遇到溢出时会直接报 panic 并终止程序运行。

Release模式下:
Rust 遇到溢出时会以 ”回环算法“(wrapping arithmetic) 处理溢出的数据。若数值超过存储范围,则根据整数类型的存储位数,从数值的低位重新计算该数值。
则将从超过得部分回归到最低位,重新开始计算该值。

简单来讲,最终的值 = 原值 % (可存储的最大值 + 1)最终值 = 原值 % ( 2n )

[注]:% 是求余符号,这里的 n 代表该类型所占位数。

例如:在 u8 类型的情况下,最大值应该为 255
若赋值为 256,则会变为 256 % (28 - 1 + 1) = 0;
若赋值为 257,则会变为 257 % (28 - 1 + 1) = 1。

在这里插入图片描述

2.4. 浮点类型(Float)

与大多数编程语言一样 Rust 也拥有两种不同精度的浮点类型,用来表示单精度浮点类型的 f32,以及用来表示双精度浮点类型的 f64f32 的数据使用 32 位来表示,f64 的数据使用 64 位来表示。Rust 中的默认浮点类型是 f64,因为现在的 CPU 几乎为 64 的,因此在处理 f64f32 类型的数据时所耗的时间基本相同,但 f64 可表示的精度更高。

[注]:所有的浮点类型都是有符号的。

示例:
创建浮点类型变量。

fn main() {

    let x = 3.14;   // f64

    let y: f32 = 3.14;  // f32
}

2.5. 布尔类型(Bool)

和大多数编程语言一样,Rust 中的布尔类型(bool)可能的值有两个:truefalsebool 类型数值的内存大小为 1 Byte

示例:
如何使用 bool 类型变量。

fn main() {
    let t = true;

    let f: bool = false; // with explicit type annotation
}

[注]:bool 类型的变量一般主要用于条件控制语句的控制条件。

2.6. 字符类型(Char)

Rust 中的 char 类型是该语言里最基本的字符类型。
示例:

fn main() {
    let c = 'z';
    let z: char = 'ℤ'; // with explicit type annotation
    let heart_eyed_cat = '😻';
}

需要注意的是,字符与字符串的不同,字符是以单引号括起来的,而字符串是以双引号括起来。char 类型只可表示字符。

3. 复合类型

复合类型可以将多个值组合为一种类型。Rust 有两种原始的复合类型:元组和数组。

3.1. 元组类型(Tuple)

元组是将具有多种类型的多个值组合成一个复合类型的一般方法。元组具有固定长度:一旦声明,它们的大小就不能增长或缩小。

我们通过在括号内用一个逗号来分隔一组值来创建一个元组。元组中的每个位置都有一个类型,元组中不同值的类型不必相同。

示例:
创建元组。

fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);
}

该变量 tup 绑定到整个元组,因为元组被视为单个复合类型。要从元组中获取单个值,我们可以使用模式匹配来解构元组值。

示例:
获取元组中的值。

fn main() {
    let tup = (500, 6.4, 1);

    let (x, y, z) = tup;

    println!("The value of y is: {y}");
}

这段代码首先创建了一个元组,并将其绑定到变量 tup 上。接着使用模式匹配的方式利用 lettup 解构,将其转换为三个单独的变量,xyz。该方法称为 “解构”(Destructuring)。最后打印出 y 的值。

另一种方法,可以通过在 . 后跟需要访问值的顺序来直接访问元组中的元素。
示例:

fn main() {
    let x: (i32, f64, u8) = (500, 6.4, 1);

    let five_hundred = x.0;

    let six_point_four = x.1;

    let one = x.2;
}

该程序创建元组 x,然后使用它们各自的索引访问元组的每个元素。与大多数编程语言一样,元组中的第一个索引是 0

3.2. 数组类型(Array)

另外一个可以存储多个值的方式则是数组类型。与元组不同的是,数组中的每个元素类型必须相同。与其他编程语言不同的是,Rust 中的数组具有固定长度。(即不可增加或减少)

示例:
创建数组类型。(不指定元素类型和数量)

fn main() {
let months = ["January", "February", "March", "April", "May", "June", "July",
              "August", "September", "October", "November", "December"];
}

创建数组类型。(指定元素类型和数量)

fn main() {
let a: [i32; 5] = [1, 2, 3, 4, 5];
}

其中,i32 是每个元素的类型。分号后的数字 5 表示数组包含五个元素。

创建数组类型。(指定初始化值)

fn main() {
let a = [3; 5];	// just like this, let a = [3, 3, 3, 3, 3]
}

访问数组元素

堆栈可以为数组分配已知固定大小的单个内存块。可以使用元素的索引来访问数组中的元素。
[注]:这里的堆栈是我们常说的程序栈,存储静态分配的变量和全局变量。堆用来存储动态分配的变量。

示例:
访问数组元素。

fn main() {
    let a = [1, 2, 3, 4, 5];

    let first = a[0];	// first == 1
    let second = a[1];	// second == 2
}

3.3. 数组越界访问

很多时候我们都会遇到这个问题——“数组越界访问”。在许多低级语言中,是“允许”数组越界访问,但这个操作很多时候来讲都是不安全的。我们来看看 Rust 是如何处理这个问题的。

示例:
实验代码

use std::io;

fn main() {
    let a = [1, 2, 3, 4, 5];

    println!("Please enter an array index.");

    let mut index = String::new();

    io::stdin()
        .read_line(&mut index)
        .expect("Failed to read line");

    let index: usize = index
        .trim()
        .parse()
        .expect("Index entered was not a number");

    let element = a[index];

    println!("The value of the element at index {index} is: {element}");
}

这段程序执行后,输入 0、1、2、3、4 都会得到正常的输出,我们会看到对应索引的数组元素。
假设我们输入一个超过数组范围的索引,来访问这个数组看看会发生什么。

imaginemiracle:data_type$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/data_type`
Please enter an array index.
6
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 6', src/main.rs:19:19
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

该程序在索引操作中使用无效值时导致运行时错误。程序退出并显示错误消息并且没有执行最后的 println! 语句。当尝试使用索引访问元素时,Rust 将检查给的索引是否小于数组长度。如果索引大于或等于长度,Rust 会报 panic 错误。这种检查必须在运行时进行,尤其是在这种情况下,因为编译器不可能知道用户稍后运行代码时将输入什么值。

这是 Rust 内存安全原则的一个示例。在许多低级语言中,并没有进行这种检查,并且当提供不正确的索引时,可以访问无效内存。Rust 通过立即退出而不是允许内存访问和继续来保护您免受此类错误的影响。

4. 基本运算

Rust 支持所有数字类型的基本数学运算:加法、减法、乘法、除法以及求余。整数除法向下舍入到最接近的整数。

示例:

fn main() {
    // addition
    let sum = 5 + 10;

    // subtraction
    let difference = 95.5 - 4.3;

    // multiplication
    let product = 4 * 30;

    // division
    let quotient = 56.7 / 32.2;
    let floored = 2 / 3; // Results in 0

    // remainder
    let remainder = 43 % 5;
}

[注]:可以查看附录 1,了解 Rust 支持的所有运算符

#附录 1:Rust 中的运算符

操作符例子描述是否可重载
!ident!(...), ident!{...},ident![...]宏扩展-
!!expr按位或逻辑补码Not
!=var != expr非质量比较PartialEq
%expr % expr算术余数Rem
%=var %= expr算术余数和赋值RemAssign
&&expr,&mut expr引用-
&&type, &mut type, &'a type,&'a mut type指针类型的引用-
&expr & expr按位与BitAnd
&=var &= expr按位与和赋值BitAndAssign
&&expr && expr逻辑与-
*expr * expr算术乘法Mul
*=var *= expr算术乘法和赋值MulAssign
**expr取消引用Deref
**const type,*mut type指针-
+trait + trait,'a + trait复合类型约束-
+expr + expr算术加法Add
+=var += expr算术加法和赋值AddAssign
,expr, expr参数和元素分隔符-
-- expr算术负号Neg
-expr - expr算术减法Sub
-=var -= expr算术减法和赋值SubAssign
->fn(…) -> type,|…| -> type函数和闭包返回类型-
.expr.ident会员访问-
...., expr.., ..expr,expr..expr右排范围文字PartialOrd
..=..=expr,expr..=expr右包含范围文字PartialOrd
....expr结构字面量更新语法-
..variant(x, ..),struct_type { x, .. }“其余的”模式绑定-
...expr...expr(已弃用,改为使用 ..=)在模式中:包含范围模式-
/expr / expr算术除法Div
/=var /= expr算术除法和赋值DivAssign
:pat: type,ident: type约束-
:ident: expr结构字段初始化器-
:'a: loop {…}循环标签-
;expr;语句和项目终止符-
;[…; len]固定大小数组语法的一部分-
<<expr << expr左移Shl
<<=var <<= expr左移和赋值ShlAssign
<expr < expr小于比较PartialOrd
<=expr <= expr小于等于比较PartialOrd
=var = expr,ident = type分配/等价-
==expr == expr平等比较PartialEq
=>pat => expr部分匹配臂语法-
>expr > expr大于比较PartialOrd
>=expr >= expr大于等于比较PartialOrd
>>expr >> expr右移Shr
>>=var >>= expr右移和赋值ShrAssign
@ident @ pat模式绑定-
^expr ^ expr按位异或BitXor
^=var ^= expr按位异或和赋值BitXorAssign
|pat | pat模式替代品-
|expr | expr按位或BitOr
|=var |= expr按位或和赋值BitOrAssign
||expr || expr短路逻辑或-
?expr?错误传播-

#附录 2: 二进制补码

学过《计算机组成原理》的朋友们一定能说出一句朗朗上口的口号。
“正数的原反补相同;负数反码,符号位不变,其它取反;负数补码等于反码加一。”

我们熟知的补码等于反码加一,事实上并不是补码的定义,而只是补码的一种求法,也只是恰好补码等于反码加一。

补码的思想类似于我们常见的钟表,当现在的时钟指向是 6 点整,那么请问时钟在什么时间指向的是 3 点整。

答案有两种,第一,在与现在相隔 3 小时的过去时钟是指向 3 点整的。第二,在与现在相隔 9 小时的未来,时钟是指向 3 点整的。

在这里插入图片描述

即就是,对于时钟而言,这里的 6 - 3 等价于 6 + 9,最终指针都会到同一个位置。这样子我们会发现,这里减去一个数,可以等同于加上另一个数(这个加数加上减数则会正好等于时钟的最大值 12,也称为同余数),在时钟的例子中 12 称为模,当超过 12 后,将会重新开始计算。

为什么要把一个二进制数搞这么复杂?事实上二进制数的原码、反码以及补码的引入是为了解决计算机处理减法的问题。

我们来看一个例子就知道了。
假设我们所使用的环境是一个 8 位的机器,则其最大存储值为 28 - 1 = 255,也就是说,当存储到 256 时将会从 0 重新开始计算(因为最高位已经无法存储),那么,该环境下的模为 256
现在在上面计算 16 + 8

在这里插入图片描述

好,让我们以同样的方法计算 16 + (-8)

在这里插入图片描述
很明显,这种计算方法计算的结果并不正确。
但是在在计算机环境中没有减法器怎么办。这个时候我们就利用时钟原理,减去一个数,我们可以找到另外一个数(同余数)与之相加后会得到相同的结果。

那么 -8 在这里的同余数是 28 - 8 = 248 (1111_1000)

好,我们直接依葫芦画瓢,16 + (-8) = 16 + 248

在这里插入图片描述
可以看到这里计算出的结果应该是 9 位才可以表示的数值,但是在 8 位机的情况下最高位无法表示将会被舍去,那么此时的计算结果就应该是我们需要的正确答案 24。成了!

事实上其中的 248,正是 (-8) 的补码形式。(-8)8 位机的表示方式应该为 1000_1000(最高位为符号位),(-8) 的补码应该为 1111_1000

OK!到这里应该对补码也有了一定自己的认识了。


Boys and Girls!!!
准备好了吗?下一节我们要开始做个小练习了哦!

不!我还没准备好,让我先回顾一下之前的。
上一篇《Rust 中的变量(特性)——Rust语言基础05》

我准备好了,掛かって来い(放马过来)!
下一篇《Rust 中的函数——Rust语言基础07》


觉得这篇文章对你有帮助的话,就留下一个赞吧v*
请尊重作者,转载还请注明出处!感谢配合~
[作者]: Imagine Miracle
[版权]: 本作品采用知识共享署名-非商业性-相同方式共享 4.0 国际许可协议进行许可。
[本文链接]: https://blog.csdn.net/qq_36393978/article/details/125562556

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 中的基本数据类型——Rust语言基础06 的相关文章

随机推荐

  • dpkg和pip在ubuntu下查找所安装的包

    目录 原因结论 原因 这些天在弄ubuntu的时候 xff0c 想查看一些包的版本 xff0c 然后上网查了一下如何去做 一开始 xff0c 我就搜到利用下面这个语句 dpkg span class token operator span
  • Docker容器挂载本地共享文件夹

    Docker挂载本地目录的方法 Docker容器启动时 xff0c 我们可以使用 v参数来挂载主机下的一个目录 比如 xff0c 我需要启动一个ubuntu的容器 xff0c 并把 opt文件挂载在这个容器上做共享文件夹 a3551444f
  • 【论文解读 ICEIT2022】Heterogeneous Graph Based Knowledge Tracing基于异构图的知识追踪

    文章目录 摘要1 引言2 相关工作2 1 知识追踪2 2 异构图嵌入 3 基于异构图嵌入的知识追踪4 实验5 结论 依然是两阶段 摘要 最近 xff0c 随着在线辅导系统的发展 xff0c 对知识追踪 Knowledge Tracing 的
  • 【AAAI22】Interpretable Knowledge Tracing: Simple and Efficient Student Modeling with Causal Relations

    文章目录 摘要1 引言 可解释的知识追踪 xff1a 简单高效的因果关系学生建模 摘要 智能辅导系统在未来的学习环境中已变得至关重要 知识追踪是该系统的重要组成部分 它是关于推断学生的技能掌握和预测他们的表现 xff0c 以相应地调整课程
  • stm32CubeIDE 在自己工程中添加.c 和.h文件

    stm32CubeIDE发布已经有一段时间了 xff0c 网上也出现了好多使用教程 xff0c 但是大多数教程都是从软件的安装 gt 汉化 gt 改软件皮肤 gt 新建工程 gt 在工程的main 函数添加自己的测试代码 gt 设置调试配置
  • 快充芯片IP5328P的寄存器数据读写[用于DIY数显快充充电宝]

    本帖DIY因为有一定的危险性 xff0c 非专业人员请勿自行尝试 如有侵权 联系删除 IP5328P是一款最大18W的快充芯片 xff0c 主要用于快充充电宝的产品 xff0c 基本支持市面上绝大部分主流的快充协议 因为能看到本帖的想必都是
  • 使用汇编开发STM32

    使用汇编开发STM32系列文章 xff0c 会长期连载 xff0c 本文作为跳转用的目录 目录 一 说明二 系列文章跳转链接1 STM32涉及到的汇编基础知识2 STM32启动文件详解3 STM32不使用启动文件点亮一个LED灯并闪烁4 S
  • STM32F10x启动文件详解

    本文为使用汇编开发STM32系列文章之 启动文件详解篇 xff0c 全部文章目录点此跳转 本文不会像其他文章一样只是简单的说一下启动文件的每个部分是什么 xff0c 说了很多却又像没说一样 本文将对启动文件中的每句话的作用及其如此编写的原因
  • 泰克示波器TDS210更换IPS彩色屏幕

    本文将介绍如何为泰克示波器TDS210更换当前流行的IPS彩色屏幕 xff0c 甚至在以后准备将屏幕图像转换为HDMI输出 xff0c 彻底对以往的老旧屏幕说拜拜 文章如有侵权请联系我删除 目录 一 缘起1 与TDS210的相遇2 改装预想
  • debian安装小记

    debian安装小记 前段时间学习debian xff0c 发现安装的过程很是痛苦 有感于网上的资料过于古老 xff0c 或者语有不详 xff0c 所以想新起一贴 xff0c 记录一下 xff0c 以供大家参考 感谢学习过程帮助过我的人们
  • 泰克示波器TDS210改装便携示波器

    前面发布过一篇文章写了起因和屏幕更换方法 xff0c 点此查看 目录 一 改装打算二 进度 一 改装打算 1 只保留TDS210的主板 xff0c 将按键板 屏幕以及电源全部替换 xff0c 按键板自己设计绘制更紧凑的 xff0c 屏幕更换
  • matlab代码文件中function是什么

    在 MATLAB 中 xff0c function 是一个用于定义函数的关键字 通过 function 关键字 xff0c 可以在 MATLAB 代码文件中创建一个函数 xff0c 函数可以接受输入参数 xff0c 并可以返回输出结果 在
  • JAVA日期格式校验正则表达式方法,yyyy年MM月,yyyy-MM-dd格式等

    今天校验了日期格式 xff0c 故记录下 xff1b 一 校验yyyy年MM月 xff1b yyyy年MM月 或者 yyyy年M月 private static final String MONTH REGEX 61 34 1 9 d 3
  • 用并查集解决岛屿问题

    并查集算法优美 xff0c 结构简单 xff0c 适用于各种图论的连接问题 xff0c 缺点就是时间复杂度高 xff0c 但是比DFS和BFS好理解一些 xff0c 遇到算法问题易于快速上手 并查集主要有三个函数 xff1a 初始化 查找和
  • Django-1 项目初始化

    文章目录 一 安装二 创建项目三 对django进行初始化的配置设置允许访问主机INSTALLED APPS配置模板目录配置数据库 默认是sqlite 四 添加视图函数以及配置路由 1 创建视图函数访问地址 2 在应用中创建urls py从
  • python、pandas内存优化

    Python的使用使我们的工作更加简单 xff0c 但是他有一些功能封装确实不够严谨 因为他的灵活和简便使我们很多时候都忘记了它的缺点 在web后端设计中 xff0c try是很有必要的 你永远不知道用户给你传过来的是什么数据 xff0c
  • virt-install命令详解

    转载自http blog csdn net starshine article details 6998189 以下是翻译的virt install man页 xff0c 从文本中粘贴过来可能有格式变化情况 有些文字比较晦涩 xff0c 比
  • 百度笔试——最大子序列 【 题目描述】对于字符串 x 和 y, 如果擦除 x 中的某些字母(有可能全擦掉或者都不擦)能够得到 y,我们就 称 y 是 x 的子序列。例如."ncd"是"nowcoder

    最大子序列 题目描述 对于字符串 x 和 y 如果擦除 x 中的某些字母 有可能全擦掉或者都不擦 能够得到 y 我们就 称 y 是 x 的子序列 例如 ncd 是 nowcoder 的子序列 而 xt 不是 现在对于给定的一个字符串 s 请
  • VMWare ESXi 开启显卡直通 (PCI 设备直通) 出现 DevicePowerOn 错误

    当前环境 xff1a VM EXSI v 7 0 3 GPGPU NVIDIA Tesla K80 1 问题描述 VMware ESXI 在硬件管理中开启显卡的直通模式后 xff0c 并将该设备添加到虚拟机新的 PCI 设备 xff0c 保
  • Rust 中的基本数据类型——Rust语言基础06

    文章目录 1 前言2 标量类型 xff08 Scalar xff09 2 1 整型 xff08 Integer xff09 2 2 Rust 的整数形式2 3 奇怪的问题 xff08 整数的溢出 xff09 2 4 浮点类型 xff08 F