【问题标题】:Usage of the u32 integer type in rustrust 中 u32 整数类型的使用
【发布时间】:2021-05-25 12:17:49
【问题描述】:

对于 Rust 中的所有原始整数类型,from_str_radix 方法将给定基数中的字符串转换为整数,将u32 整数作为基数的参数。鉴于如果基数不在[2, 36] 范围内,函数会出现恐慌,为什么from_str_radix 不采用u8 而不是u32,因为u8 已经可以存储比允许的最大整数更大的整数基数?

这种事情也发生在其他整数方法中,例如powu8的最大值是255,而2^255已经大于u128(Rust中最大的整数类型)所能存储的最大值,那为什么pow函数要取一个u32,看到大多数u32 的指数值会导致溢出吗?

【问题讨论】:

  • 可能与对齐有关。 u32 值可能保证是 4 字节对齐的,这可能对内部操作很重要。另一种可能的解释是人们可能会使用评估为u32 的表达式来调用它,这会导致转换范围缩小。第三种选择是偶然的。

标签: rust


【解决方案1】:

Niko in #22240(强调添加):

这些是我们打算在标准库中遵循的准则。这些指南不打算作为在标准库之外使用的通用指南(当然可以选择这样做)。

  1. 如果值应始终大于或等于零,则使用无符号值,否则使用有符号值。
  2. 对于与大小与内存大小成正比的数据结构相关的索引、指针或其他值,请使用usizeisize
  3. 对于值的可接受域完全适合固定位数的情况,请使用适当的固定大小类型。例如,write_u16 之类的方法将采用 u16 参数。
  4. 否则,如果值的范围很窄,则使用i32/u32,否则使用i64/u64

例子:

  • 向量索引和哈希图长度使用usize
  • 文件大小为u64,因为文件的最大大小与可寻址内存无关。
  • write_u16 之类的东西需要 u16(我知道,令人震惊!)
  • 整数的基数将使用u32
    • 您可能期望u8,因为高于 256 的基数没有用,但有用的基数的域实际上比 u8 小得多,因此使用 u8 并不能提供有意义的保证,并且只会增加摩擦。

【讨论】:

  • 我认为您的报价是对先前在同一篇文章中所述的这条规则的后续(强调我的)"... 值的可接受域完全适合 固定位数,使用适当的固定大小类型。”.
  • @rodrigo:好点;事实上,数字 4 更相关。我已经包含了更完整的报价。
猜你喜欢
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 2021-03-23
  • 2021-07-28
  • 2022-12-12
  • 2023-04-03
相关资源
最近更新 更多