【typenum】 16 无符号整数标记

一、源码

这段代码是 Rust 中用于实现编译时无符号整数的核心部分。它定义了一个 Unsigned trait 并为两种类型实现了该 trait:UTerm(表示零)和 UInt<U, B>(表示非零数字)。

  1. 定义(marker_traits.rs)
/// The **marker trait** for compile time unsigned integers.
///
/// # Example
/// ```rust
/// use typenum::{Unsigned, U3};
///
/// assert_eq!(U3::to_u32(), 3);
/// assert_eq!(U3::I32, 3);
/// ```
pub trait Unsigned: Sealed + Copy + Default + 'static {#[allow(missing_docs)]const U8: u8;#[allow(missing_docs)]const U16: u16;#[allow(missing_docs)]const U32: u32;#[allow(missing_docs)]const U64: u64;#[cfg(feature = "i128")]#[allow(missing_docs)]const U128: u128;#[allow(missing_docs)]const USIZE: usize;#[allow(missing_docs)]const I8: i8;#[allow(missing_docs)]const I16: i16;#[allow(missing_docs)]const I32: i32;#[allow(missing_docs)]const I64: i64;#[cfg(feature = "i128")]#[allow(missing_docs)]const I128: i128;#[allow(missing_docs)]const ISIZE: isize;#[allow(missing_docs)]fn to_u8() -> u8;#[allow(missing_docs)]fn to_u16() -> u16;#[allow(missing_docs)]fn to_u32() -> u32;#[allow(missing_docs)]fn to_u64() -> u64;#[cfg(feature = "i128")]#[allow(missing_docs)]fn to_u128() -> u128;#[allow(missing_docs)]fn to_usize() -> usize;#[allow(missing_docs)]fn to_i8() -> i8;#[allow(missing_docs)]fn to_i16() -> i16;#[allow(missing_docs)]fn to_i32() -> i32;#[allow(missing_docs)]fn to_i64() -> i64;#[cfg(feature = "i128")]#[allow(missing_docs)]fn to_i128() -> i128;#[allow(missing_docs)]fn to_isize() -> isize;
}
  1. 实现
impl Unsigned for UTerm {const U8: u8 = 0;const U16: u16 = 0;const U32: u32 = 0;const U64: u64 = 0;#[cfg(feature = "i128")]const U128: u128 = 0;const USIZE: usize = 0;const I8: i8 = 0;const I16: i16 = 0;const I32: i32 = 0;const I64: i64 = 0;#[cfg(feature = "i128")]const I128: i128 = 0;const ISIZE: isize = 0;#[inline]fn to_u8() -> u8 {0}#[inline]fn to_u16() -> u16 {0}#[inline]fn to_u32() -> u32 {0}#[inline]fn to_u64() -> u64 {0}#[cfg(feature = "i128")]#[inline]fn to_u128() -> u128 {0}#[inline]fn to_usize() -> usize {0}#[inline]fn to_i8() -> i8 {0}#[inline]fn to_i16() -> i16 {0}#[inline]fn to_i32() -> i32 {0}#[inline]fn to_i64() -> i64 {0}#[cfg(feature = "i128")]#[inline]fn to_i128() -> i128 {0}#[inline]fn to_isize() -> isize {0}
}
impl<U: Unsigned, B: Bit> Unsigned for UInt<U, B> {const U8: u8 = B::U8 | U::U8 << 1;const U16: u16 = B::U8 as u16 | U::U16 << 1;const U32: u32 = B::U8 as u32 | U::U32 << 1;const U64: u64 = B::U8 as u64 | U::U64 << 1;#[cfg(feature = "i128")]const U128: u128 = B::U8 as u128 | U::U128 << 1;const USIZE: usize = B::U8 as usize | U::USIZE << 1;const I8: i8 = B::U8 as i8 | U::I8 << 1;const I16: i16 = B::U8 as i16 | U::I16 << 1;const I32: i32 = B::U8 as i32 | U::I32 << 1;const I64: i64 = B::U8 as i64 | U::I64 << 1;#[cfg(feature = "i128")]const I128: i128 = B::U8 as i128 | U::I128 << 1;const ISIZE: isize = B::U8 as isize | U::ISIZE << 1;#[inline]fn to_u8() -> u8 {B::to_u8() | U::to_u8() << 1}#[inline]fn to_u16() -> u16 {u16::from(B::to_u8()) | U::to_u16() << 1}#[inline]fn to_u32() -> u32 {u32::from(B::to_u8()) | U::to_u32() << 1}#[inline]fn to_u64() -> u64 {u64::from(B::to_u8()) | U::to_u64() << 1}#[cfg(feature = "i128")]#[inline]fn to_u128() -> u128 {u128::from(B::to_u8()) | U::to_u128() << 1}#[inline]fn to_usize() -> usize {usize::from(B::to_u8()) | U::to_usize() << 1}#[inline]fn to_i8() -> i8 {B::to_u8() as i8 | U::to_i8() << 1}#[inline]fn to_i16() -> i16 {i16::from(B::to_u8()) | U::to_i16() << 1}#[inline]fn to_i32() -> i32 {i32::from(B::to_u8()) | U::to_i32() << 1}#[inline]fn to_i64() -> i64 {i64::from(B::to_u8()) | U::to_i64() << 1}#[cfg(feature = "i128")]#[inline]fn to_i128() -> i128 {i128::from(B::to_u8()) | U::to_i128() << 1}#[inline]fn to_isize() -> isize {B::to_u8() as isize | U::to_isize() << 1}
}

二、Unsigned Trait 定义

Unsigned 是一个标记 trait(marker trait),用于表示编译时的无符号整数。它要求实现者必须:

  • 实现 Sealed trait(防止外部实现)

  • 实现 Copy 和 Default

  • 具有 'static 生命周期

它定义了一系列关联常量和方法,用于将编译时数字转换为运行时数字:
关联常量:

  • U8, U16, U32, U64, U128, USIZE:对应各种无符号整数类型的值

  • I8, I16, I32, I64, I128, ISIZE:对应各种有符号整数类型的值

方法:

  • to_u8(), to_u16(), …, to_isize():返回对应类型的值

三、UTerm 的实现

UTerm 表示数字 0,所以所有关联常量和方法都返回 0。

四、UInt<U, B> 的实现

UInt<U, B> 是一个类型级别的数字表示,其中:

  • U 是一个 Unsigned 类型,表示高位部分

  • B 是一个 Bit 类型(可以是 B0 或 B1),表示最低位

这种表示方法实际上是二进制表示。例如:

  • UInt<UTerm, B1> 表示 1

  • UInt<UInt<UTerm, B1>, B0> 表示 10(二进制)即 2(十进制)

实现细节:

对于每个关联常量和方法,计算方式都是:


B::U8 | U::U8 << 1

这相当于:

  1. 将高位部分 U 左移一位(相当于乘以 2)
  2. 加上最低位 B 的值

例如,对于数字 3(二进制 11):

  • 表示为 UInt<UInt<UTerm, B1>, B1>

  • 计算 U8:B1::U8 | UInt<UTerm, B1>::U8 << 1 = 1 | (1 << 1) = 1 | 2 = 3

五、示例解释

文档中的示例:


use typenum::{Unsigned, U3};assert_eq!(U3::to_u32(), 3);
assert_eq!(U3::I32, 3);
  • U3 实际上是 UInt<UInt<UTerm, B1>, B1>

  • 当调用 to_u32() 或访问 I32 时,会递归计算得到值 3

六、特点

这种设计允许在编译时进行数值计算,常用于:

  • 数组长度的类型级验证

  • 矩阵维度的类型级检查

  • 其他需要编译时数值计算的场景

七、性能

由于所有计算都在编译时完成,运行时没有任何开销。生成的代码就像直接使用了常量一样高效。

这种类型级别的数字表示是 Rust 泛型编程和类型系统强大能力的典型体现。

八、改进建议

  1. 移除 #[cfg(feature = “i128”)]
    由于 Rust 1.26+ 已经稳定支持 i128/u128,不再需要 feature gate 来控制其可用性,可以移除所有 #[cfg(feature = “i128”)] 条件编译。
  2. 合并 Unsigned 相关定义到 uint.rs
    UInt 结构体(表示非零无符号整数)和 UTerm(表示零)都是用于无符号整数计算,可以将它们的定义、Unsigned trait 及其实现放在同一个文件(如 uint.rs),而不是分散在 marker_traits.rs 和 uint.rs 中。
    其优点:
  • 减少文件跳转,提高可读性

  • 逻辑相关的代码放在一起,便于维护

  • 更符合 Rust 的模块化设计(类型 + trait + 实现放在一起)

  1. 提供 From 转换

允许从 UTerm 和 UInt 转换到基本整数类型,方便使用:


impl From<UTerm> for u8 {fn from(_: UTerm) -> u8 { 0 }
}impl<U: Unsigned, B: Bit> From<UInt<U, B>> for u8 {fn from(n: UInt<U, B>) -> u8 {B::U8 | U::to_u8() << 1}
}

这样用户可以直接:

let x: u8 = U3::into();  // 而不是 U3::to_u8()
  1. 为 Unsigned 增加 ZERO 和 ONE 常量

由于无符号整数一定有 0 和 1,可以在 trait 中定义这两个常量,方便通用代码使用:


pub trait Unsigned: Sealed + Copy + Default + 'static {const ZERO: Self;const ONE: Self;// ...
}

然后分别在 UTerm 和 UInt 中实现:


impl Unsigned for UTerm {const ZERO: Self = UTerm;const ONE: Self = UInt<UTerm, B1>;  // 需要确保 UInt<UTerm, B1> 是 1
}impl<U: Unsigned, B: Bit> Unsigned for UInt<U, B> {const ZERO: Self = UTerm;  // 可能需要调整,或提供 From<UTerm>const ONE: Self = UInt<UTerm, B1>;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93795.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重温k8s基础概念知识系列四(服务、负载均衡和联网)

文章目录1、Kubernetes 网络模型2、为什么需要 Service&#xff1f;2.1、定义service2.2、Service的类型2.3、Service 工作原理2.4、Service 与 DNS3、Ingress&#xff08;高级流量管理&#xff09;3.1、定义Ingress 资源3.2、Ingress 规则4、常见面试高频问答5、总结1、Kubern…

基于SpringBoot的停车场管理系统【2026最新】

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

Nginx前后端分离反代(VUE+FastAPI)

原文链接&#xff1a;Nginx前后端分离反代&#xff08;VUEFastAPI&#xff09; < Ping通途说 0.前言 工作需求自己全栈开发了一个后台后端&#xff0c;要求前后端分离&#xff0c;即nginx静态代理前端文件&#xff0c;再代理后端接口。以前自己也遇过这种情况&#xff0c;但…

豆包1.5 Vision Lite 对比 GPT-5-min,谁更适合你?实测AI模型选型利器 | AIBase

“团队要上线一个智能客服系统&#xff0c;预算有限&#xff0c;中文场景为主&#xff0c;偶尔需要读图——该选豆包1.5还是GPT-5-min&#xff1f;” “个人开发者想接大模型API做写作助手&#xff0c;要求响应快、成本低&#xff0c;Claude Haiku、Moonshot、GPT-5-min 哪个更…

Swift与C++混编深度解决方案:手动桥接 vs SwiftyCPP框架性能终极评测

Swift与C混编深度解决方案&#xff1a;手动桥接 vs SwiftyCPP框架性能终极评测一、技术背景与行业痛点1.1 Swift与C互操作现状1.2 行业痛点数据二、解决方案架构对比2.1 手动桥接OC中间层实现细节&#xff1a;2.2 SwiftyCPP自动框架技术突破&#xff1a;三、性能深度评测3.1 测…

[Oracle数据库] Oracle 常用函数

目录 一、先搞懂这些基础约定 二、数值函数&#xff1a;处理数字的 “小帮手” 1️⃣MOD (n1, n2)&#xff1a;取余数 2️⃣ROUND (n1 [, n2])&#xff1a;四舍五入 3️⃣TRUNC (n1 [, n2])&#xff1a;截断&#xff08;不四舍五入&#xff09; 其他常用数值函数 三、字…

Pytorch模型复现笔记-STN(空间注意力Transformer网络)讲解+架构搭建(可直接copy运行)+ MNIST数据集视角调整实验

Spatial Transformer Networks 本文了讲述STN的基本架构&#xff0c;空间几何注意力模块的基本原理&#xff0c;冒烟测试以及STN在MNIST数据集用于模型自动调整图片视角的实验&#xff0c;如果大家有不懂或者发现了错误的地方&#xff0c;欢迎讨论。 中文名&#xff1a;空间Tra…

【LeetCode】16. 最接近的三数之和

文章目录16. 最接近的三数之和题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解题思路算法分析问题本质分析排序双指针法详解双指针移动策略搜索过程可视化各种解法对比算法流程图边界情况处理时间复杂度分析空间复杂度分析关键优化点实际应用场景测试用例设计…

微信小程序实现蓝牙开启自动播放BGM

下面是一个完整的微信小程序实现方案&#xff0c;当蓝牙设备连接时自动播放背景音乐(BGM)。实现思路监听蓝牙设备连接状态当检测到蓝牙设备连接时&#xff0c;自动播放音乐当蓝牙断开时&#xff0c;停止音乐播放处理相关权限和用户交互完整代码实现1. 项目结构text/pages/index…

XML 序列化与操作详解笔记

一、XML 基础概念XML&#xff08;eXtensible Markup Language&#xff0c;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言&#xff0c;由 W3C 制定&#xff0c;具有以下特点&#xff1a;可扩展性&#xff1a;允许自定义标记&#xff08;如<Student>、<…

第八十四章:实战篇:图 → 视频:基于 AnimateDiff 的视频合成链路——让你的图片“活”起来,瞬间拥有“电影感”!

AI图生视频前言&#xff1a;从“刹那永恒”到“动态大片”——AnimateDiff&#xff0c;让图片“活”起来&#xff01;第一章&#xff1a;痛点直击——静态图像到视频&#xff0c;不是“幻灯片”那么简单&#xff01;第二章&#xff1a;探秘“时间魔法”&#xff1a;AnimateDiff…

2025深大计算机考研复试经验贴(已上岸)

如果你在初试出分前看到此贴 我建议&#xff1a; 准备机试和简历&#xff0c;即使你不估分&#xff1a;因为如果要准备春招的话&#xff0c;也总要刷题和做简历的。尽早估分&#xff0c;查一下往年的复试线&#xff0c;如果有望进复试&#xff0c;可尽早开始准备。 Preface …

用Pygame开发桌面小游戏:从入门到发布

一、引言 Pygame是一个基于Python的跨平台游戏开发库,它提供了简单易用的图形、声音和输入处理功能,非常适合新手入门游戏开发。本文将以"经典游戏合集"项目为例,带你一步步了解如何使用Pygame开发、打包和发布自己的桌面小游戏。 二、开发环境搭建 安装Python:…

CSS backdrop-filter:给元素背景添加模糊与色调的高级滤镜

在现代网页设计中&#xff0c;半透明元素搭配背景模糊效果已成为流行趋势 —— 从毛玻璃导航栏、模态框遮罩&#xff0c;到卡片悬停效果&#xff0c;这种设计能让界面更具层次感和高级感。实现这一效果的核心 CSS 属性&#xff0c;正是backdrop-filter。它能对元素背后的内容&a…

检索增强生成(RAG) 缓存增强生成(CAG) 生成中检索(RICHES) 知识库增强语言模型(KBLAM)

以下是当前主流的四大知识增强技术方案对比&#xff0c;涵盖核心原理、适用场景及最新发展趋势&#xff0c;为开发者提供清晰的技术选型参考&#xff1a; &#x1f50d; 一、RAG&#xff08;检索增强生成&#xff09;​​ 核心原理​&#xff1a; 动态检索外部知识库&#xff0…

LLM(大语言模型)的工作原理 图文讲解

目录 1. 条件概率&#xff1a;上下文预测的基础 2. LLM 是如何“看着上下文写出下一个词”的&#xff1f; 补充说明&#xff08;重要&#xff09; &#x1f4cc; Step 1: 输入处理 &#x1f4cc; Step 2: 概率计算 &#x1f4cc; Step 3: 决策选择 &#x1f914; 一个有…

Python netifaces 库详解:跨平台网络接口与 IP 地址管理

一、前言 在现代网络编程中&#xff0c;获取本机的网络接口信息和 IP 配置是非常常见的需求。 例如&#xff1a; 开发一个需要选择合适网卡的 网络服务&#xff1b;在多网卡环境下实现 流量路由与控制&#xff1b;在系统诊断工具中展示 IP/MAC 地址、子网掩码、默认网关&#x…

HTML应用指南:利用POST请求获取上海黄金交易所金价数据

上海黄金交易所&#xff08;SGE&#xff09;作为中国唯一经国务院批准、专门从事黄金等贵金属交易的国家级市场平台&#xff0c;自成立以来始终秉持“公开、公平、公正”的原则&#xff0c;致力于构建规范、高效、透明的贵金属交易市场体系。交易所通过完善的交易机制、严格的风…

C++常见面试题-1.C++基础

一、C 基础 1.1 语言特性与区别C 与 C 的主要区别是什么&#xff1f;C 为何被称为 “带类的 C”&#xff1f; 主要区别&#xff1a;C 引入了面向对象编程&#xff08;OOP&#xff09;特性&#xff08;类、继承、多态等&#xff09;&#xff0c;而 C 是过程式编程语言&#xff1…

Tomcat里catalina.sh详解

在 Tomcat 中&#xff0c;catalina.sh&#xff08;Linux/macOS&#xff09;或 catalina.bat&#xff08;Windows&#xff09;是 核心的启动和关闭脚本&#xff0c;用于控制 Tomcat 服务器的运行。它是 Tomcat 的“主控脚本”&#xff0c;负责设置环境变量、启动/关闭 JVM 进程&…