#integer #fixed-size #non-standard #unaligned #misaligned #unsigned

no-std intx

定义具有非标准但固定大小的新的整数类型

1个不稳定版本

0.1.0 2023年5月15日

#315嵌入式开发

Download history 3317/week @ 2024-03-14 3348/week @ 2024-03-21 1983/week @ 2024-03-28 2065/week @ 2024-04-04 1882/week @ 2024-04-11 1994/week @ 2024-04-18 2035/week @ 2024-04-25 1991/week @ 2024-05-02 1841/week @ 2024-05-09 2239/week @ 2024-05-16 1660/week @ 2024-05-23 2481/week @ 2024-05-30 1422/week @ 2024-06-06 1679/week @ 2024-06-13 1510/week @ 2024-06-20 1139/week @ 2024-06-27

5,983 每月下载量
9 个crate中使用 (2 直接)

Apache-2.0/MIT

100KB
2K SLoC

[2]: https://github.com/Robbepop/intx/actions/workflows/rust.yml [4]: https://docs.rs/intx [6]: https://crates.io/crates/intx

持续集成 文档 Crates.io
[ci][2] [docs][4] [crates][6]

intx - Rust的非标准固定位宽整数

警告:由于缺少大量测试,此crate尚未准备好用于生产。

此crate提供了具有非标准且固定位宽的新整数类型,例如 U24I48U96 等等,重点关注数据布局和对齐。

  • 此crate提供的所有整数类型都使用它们表示所需的最少字节数。例如,U24 需要3个字节,I48 需要6个字节。
  • 此crate提供的所有整数类型的对齐方式始终为1。如果需要其他对齐方式,建议将整数类型包装在新的类型中,并通过 #[align(N)] 强制对齐。
  • 目前,此crate提供的整数类型没有定义丰富的算术方法。相反,预期将它们转换为Rust原生整数,进行计算,最后将结果转换回来。如果需求,未来可能会支持此功能。
  • 此crate提供的整数类型的二进制表示与Rust内置整数类型一样,使用二进制补码。

数据布局

该crate内部提供的所有整数类型都由一个单字节数组组成。例如,结构体U24的构成如下:struct U24([u8; 3]);,这有助于实现最优的内存使用和1字节对齐(如果需要的话)。

API

该crate提供的整数类型只具有非常有限的API。

  • 所有整数类型实现的特质如下

    • CloneCopyDefaultEqPartialEqOrdPartialOrdHash
      • 对于每个整数类型,都尽可能高效地实现了通用特质。
    • DebugDisplayBinaryOctalLowerHexUpperHexLowerExpUpperExp
      • 整数类型模仿了下一个更大的Rust内置整数类型的显示表示。
  • 还实现了Endian感知的转换例程

    • from_ne_bytesto_ne_bytes:从和到本地Endian字节的转换。(始终高效)
    • from_le_bytesto_le_bytes:从和到小Endian字节的转换。
    • from_be_bytesto_be_bytes:从和到大Endian字节的转换。
  • 丰富的FromTryFrom实现

    • 所有提供的整数类型都有一系列丰富的FromTryFrom特质实现,可以高效地在不同整数类型和Rust内置整数之间进行转换。

用法

该crate的重点是数据布局、对齐和空间优化。它是在wasmi解释器需要更高效的内部字节码表示时作为一个实验而制作的。例如,在某些位置使用3字节大小的U24而不是4字节大小的u32,这允许Rust编译器在某些情况下更有效地打包数据结构,特别是在使用enum类型时。

如果您的重点在于逻辑方面,您主要对非标准但固定位宽的整数类型的算术运算感兴趣,那么可能ux crate更适合您。

替代方案

替代的ux crate也提供了非标准且固定位宽的整数,但这两个crate的关注点非常不同。

属性 intx ux
size_of 所有整数类型都需要它们表示的最小字节数。例如,size_of<intx::U24>() == 3 所有整数类型都具有与下一个最大的Rust内置整数原语相同的 size_of。例如,size_of<ux::u24>() == size_of<u32>() == 4
align_of 所有整数类型具有1的对齐方式。如果需要其他对齐方式,可以将整数类型包装在 newtype 中,并通过 #[align(N)] 强制另一个对齐方式。 所有整数类型都具有与下一个最大的Rust内置整数原语相同的 align_of。例如 align_of<ux::u24>() == align_of<u32> == 4
焦点 使用整数对打包数据结构的布局和对齐。 对非标准位宽整数类型的算术操作。
API 整数类型提供了最小的API界面。主要是整数和Rust原语之间的 FromTryFrom 实现以及从Rust原语中已知的字节转换,如 to_ne_bytesfrom_le_bytes 整数类型试图模仿Rust内置整数类型,提供大量对它们的算术操作。

这两个crate都提供了在不同整数类型和Rust原语之间进行转换的丰富支持。

许可

在以下任一许可下授权:

任选其一。

贡献

除非你明确声明,否则根据Apache-2.0许可证定义的,任何有意提交以包含在你所做工作的贡献,都应按上述方式双许可,不附加任何额外条款或条件。

无运行时依赖