Rust中u32整数类型的用法

4
对于 Rust 中所有原始整数类型,from_str_radix 方法将给定基数的字符串转换为整数,并将 u32 整数作为基数的参数。虽然该函数会在基数不在 [2,36] 范围内时引发 panic,但为什么 from_str_radix 不使用 u8 代替 u32 呢?因为一个 u8 已经可以存储比允许使用的最大基数还要大的整数。
类似的情况也会出现在其他整数方法中,例如 pow。一个 u8 的最大值是 255,而 2^255 已经大于 Rust 中可存储的最大整数类型 u128 的最大值,那么为什么 pow 函数使用 u32,因为大多数 u32 的指数值会导致溢出?

1
可能与对齐有关。u32值可能保证为4字节对齐,这可能对内部操作很重要。另一个可能的解释是人们可能会使用计算结果为u32的表达式进行调用,这将导致缩小转换。第三个选项是这是意外发生的。 - Bartek Banachewicz
1个回答

9

根据 #22240中的Niko(已加重):

这些是我们在标准库中打算遵循的准则。这些准则不是普适性的准则,不能用于标准库之外(当然也可以选择使用)。 1. 如果值始终大于或等于零,则使用无符号值,否则使用有符号值。 2. 对于与大小与内存大小成比例的数据结构相关联的索引、指针或其他值,请使用usize或isize。 3. 对于可接受值域完全适合固定位数的情况,请使用相应的固定大小类型。例如,像write_u16这样的方法将采用u16参数。 4. 否则,如果值的范围很窄,则使用i32/u32,否则使用i64/u64。
示例: - 向量索引和哈希映射长度使用usize。 - 文件大小将是u64,因为文件的最大大小与可寻址内存无关。 - 类似write_u16的东西需要一个u16(震惊,我知道!) - 整数的基数将使用u32。 - 您可能期望使用u8,因为高于256的基数没有用处,但实际上有用的基数域要比u8小得多,因此使用u8并没有提供有意义的保证,只会增加摩擦。

我认为你的引用是对同一篇文章中先前提到的规则的跟进(强调我的)“……当一个值的可接受域完全适合于固定数量的位时,请使用相应的固定大小类型。” - rodrigo
@rodrigo:说得好,事实上,第四点更为相关。我已经包含了一个更完整的引用。 - eggyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接