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

时间:2016-09-21 17:10:15

标签: rust

我正在制作一个大小为n个随机数的数组的函数,但我对while的比较会引发错误。

>>> x
array([(1, [1.0, 2.0, 3.0]), (2, [4.0, 5.0, 6.0]), (3, [7.0, 8.0, 9.0])], 
      dtype=[('id', '<i8'), ('arr', '<f8', (3,))])

抱怨:预期while ar.len() as i32 < size { } !(+,::或{{1}之一},找到<

如果我删除>抱怨{,如果我向size变量添加as i32,那么它就不会抱怨。

2 个答案:

答案 0 :(得分:8)

当您从较小尺寸类型投射到较大尺寸类型时,您不会丢失任何数据,但数据现在会占用更多空间。

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

假设我有一个大小 1 的方框,可以容纳数字0到9,另一个大小 2 的方框可以容纳数字0到99。

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

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

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

在这个特定的案例中,它有点复杂。 usize被定义为&#34;指针大小的整数&#34;,通常是机器的原始大小。在64位x64处理器上,这意味着usize是64位,而在32位x86处理器上,它将是32位。

usize投射到i32因此会根据您运行的机器类型而有所不同。

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

你真的想输入

while (ar.len() as i32) < size { }

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

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

while ar.len() < size as usize { }

答案 1 :(得分:3)

您的size似乎是i32类型。你要么需要括号:

while (ar.len() as i32) < size { }

或将size投射到usize

while ar.len() < size as usize { }

len()返回usize时,比较两边的类型都需要匹配。您需要在第一种情况下使用括号,以便<运算符不会尝试将i32size进行比较,而是将ar.len() as i32size进行比较,这是您的意图。