首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么核心::cmp::排序::cmp强制转换为i32比较?

为什么核心::cmp::排序::cmp强制转换为i32比较?
EN

Stack Overflow用户
提问于 2022-04-20 09:06:13
回答 1查看 129关注 0票数 0

THe core::cmp::Ordering类型有#[repr(u8)],但是在cmp方法中我们看到以下代码:

代码语言:javascript
复制
(*self as i32).cmp(&(*other as i32))

为什么铸造不是u8

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-20 09:27:12

为什么铸造不是为了u8?

第一个原因是Ordering的变体有值-1、0和+1,所以它首先需要一个i8。

虽然这只是int的一个替代,i32,但其原因仍然是i32,而不是缩小到i8是标准库整数使用指南

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

这些示例特别指出,这是一个not (3)实际上不适用的情况,而不是这个示例,而是一个非常接近的例子:

整数的基数将使用u32。您可能会想到u8**,,因为大于256的基数并不有用,但是--有用的radices的域实际上要比小得多--所以使用** u8 并不能提供有意义的保证,只会增加摩擦

同样的道理也适用于排序,它可能是一个i8,但没有理由违反准则,这可能需要额外的编译器工作(因为一些平台只有32位以下所有操作的子集,例如ARM)。虽然对于16位寄存器的平台来说,一个缺点可能是个问题,但我不知道Rust是否支持或关心这些(我知道它支持16位以上的指针/地址,对GPRs不太确定)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71936962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档