从"usize"转换为"i32"与其他方式有什么区别?

Seb*_*ian 2 rust

我正在创建一个函数,使一个大小为n的数组随机数,但我对while的比较会引发错误.

while ar.len() as i32 < size { }
Run Code Online (Sandbox Code Playgroud)

抱怨有:预期中的一个!,(,+,,,::,<,或>发现{.

如果我删除as i32它抱怨,mismatch types如果我添加一个as usize大小变量,那么它不会抱怨.

She*_*ter 10

当您从较小的类型转换为较大的类型时,您不会丢失任何数据,但现在数据将占用更多空间.

当您从较大的类型转换为较小的类型时,可能会丢失一些数据,但数据占用的空间会减少.

假设我有一个大小为1的盒子,可以容纳数字0到9,另一个大小为2的盒子可以容纳数字0到99.

如果我想存储数字7; 两个盒子都可以使用,但如果我使用较大的盒子,我将留下空间.我可以毫不费力地将值从较小的盒子移动到较大的盒子.

如果我想存储号码42; 只有一个盒子可以容纳这个数字:较大的一个.如果我尝试取数字并将其塞入较小的盒子中,则会丢失一些东西,通常是数字的上半部分.在这种情况下,我的42将变成2!哎呀!

此外,签名和无签名扮演一个角色.在带符号的二进制数中,最高位表示数字的符号.当您在有符号和无符号数字之间进行转换时,可能会错误地解释该值!这可能意味着像42这样的数字变成-48!


在这种特殊情况下,它有点复杂.A usize被定义为"指针大小的整数",通常是机器的原始大小.在64位x64处理器上,这意味着a usize是64位,而在32位x86处理器上,它将是32位.

因此,根据您运行的机器类型,将a转换usize为a i32将以不同的方式运行.


您得到的错误消息是因为您尝试过的代码在语法上不正确,并且编译器没有提供良好的错误消息.

你真的想打字

while (ar.len() as i32) < size { }
Run Code Online (Sandbox Code Playgroud)

括号将帮助正确应用优先级.

为了安全起见,我会投入更大的价值:

while ar.len() < size as usize { }
Run Code Online (Sandbox Code Playgroud)

  • 只是为了澄清,因为似乎没有人指出这一点:问题是编译器*认为*代码引入了参数化类型.也就是说,像`Vec <usize>`之类的东西,除了它找到`{`而不是`>`并且感到困惑.*是*,`i32`没有*任何参数,但解析器*不知道.*这一切都发生在那种信息已知之前. (3认同)

lje*_*drz 6

看来你size是属于类型的i32。您要么需要括号:

while (ar.len() as i32) < size { }
Run Code Online (Sandbox Code Playgroud)

或投射sizeusize

while ar.len() < size as usize { }
Run Code Online (Sandbox Code Playgroud)

aslen()返回 ausize并且比较两边的类型需要匹配。在第一种情况下您需要括号,以便<运算符不会尝试i32与您的意图进行比较size,而是ar.len() as i32size您的意图进行比较。