Lean 语言参考手册

20.4. 定精度整数🔗

Lean 的标准库包含通常的各种固定宽度整数类型。 从形式化和证明的角度来看,这些类型是适当大小的位向量的包装器;这些包装器确保应用正确的算术操作等实现。 在编译后的代码中,它们的表示非常高效:编译器对它们有特殊的支持,就像对其他基础类型一样。

20.4.1. 逻辑模型🔗

固定宽度整数可以是无符号的或有符号的。 此外,它们有五种大小:8 位、16 位、32 位和 64 位,以及当前架构的字长。 在它们的逻辑模型中,无符号整数是包装了适当宽度的 BitVec 的结构体。 有符号整数包装了相应的无符号整数,并使用二进制补码表示。

20.4.1.1. 无符号🔗

🔗结构体
USize : Type
USize : Type

平台架构字长的无符号整数。

在 32 位架构上,USize 等价于 UInt32。在 64 位机器上,它等价于 UInt64

USize.ofBitVec

BitVec System.Platform.numBits 创建 USize。此函数会被原生实现覆盖。

toBitVec : BitVec System.Platform.numBits

USize 解包为 BitVec System.Platform.numBits。此函数会被原生实现覆盖。

🔗结构体
UInt8 : Type
UInt8 : Type

无符号 8 位整数。

编译器对此类型提供特殊支持,因此它可以表示为未装箱的 8 位值,而不必包装 BitVec 8

UInt8.ofBitVec

BitVec 8 创建 UInt8。此函数会被原生实现覆盖。

toBitVec : BitVec 8

UInt8 解包为 BitVec 8。此函数会被原生实现覆盖。

🔗结构体
UInt16 : Type
UInt16 : Type

无符号 16 位整数。

编译器对此类型提供特殊支持,因此它可以表示为未装箱的 16 位值,而不必包装 BitVec 16

UInt16.ofBitVec

BitVec 16 创建 UInt16。此函数会被原生实现覆盖。

toBitVec : BitVec 16

UInt16 解包为 BitVec 16。此函数会被原生实现覆盖。

🔗结构体
UInt32 : Type
UInt32 : Type

无符号 32 位整数。

编译器对此类型提供特殊支持,因此它可以表示为未装箱的 32 位值,而不必包装 BitVec 32

UInt32.ofBitVec

BitVec 32 创建 UInt32。此函数会被原生实现覆盖。

toBitVec : BitVec 32

UInt32 解包为 BitVec 32。此函数会被原生实现覆盖。

🔗结构体
UInt64 : Type
UInt64 : Type

无符号 64 位整数。

编译器对此类型提供特殊支持,因此它可以表示为未装箱的 64 位值,而不必包装 BitVec 64

UInt64.ofBitVec

BitVec 64 创建 UInt64。此函数会被原生实现覆盖。

toBitVec : BitVec 64

UInt64 解包为 BitVec 64。此函数会被原生实现覆盖。

20.4.1.2. 有符号🔗

🔗结构体
ISize : Type
ISize : Type

平台架构字长的有符号整数。

在 32 位架构上,ISize 等价于 Int32。在 64 位机器上,它等价于 Int64。编译器对此类型提供特殊支持,因此它可以表示为未装箱的值。

ISize.ofUSize
toUSize : USize

将平台字长有符号整数转换为作为其二进制补码编码的平台字长无符号整数。

🔗结构体
Int8 : Type
Int8 : Type

有符号 8 位整数。

编译器对此类型提供特殊支持,因此它可以表示为未装箱的 8 位值。

Int8.ofUInt8
toUInt8 : UInt8

将 8 位有符号整数转换为作为其二进制补码编码的 8 位无符号整数。

🔗结构体
Int16 : Type
Int16 : Type

有符号 16 位整数。

编译器对此类型提供特殊支持,因此它可以表示为未装箱的 16 位值。

Int16.ofUInt16
toUInt16 : UInt16

将 16 位有符号整数转换为作为其二进制补码编码的 16 位无符号整数。

🔗结构体
Int32 : Type
Int32 : Type

有符号 32 位整数。

编译器对此类型提供特殊支持,因此它可以表示为未装箱的 32 位值。

Int32.ofUInt32
toUInt32 : UInt32

将 32 位有符号整数转换为作为其二进制补码编码的 32 位无符号整数。

🔗结构体
Int64 : Type
Int64 : Type

有符号 64 位整数。

编译器对此类型提供特殊支持,因此它可以表示为未装箱的 64 位值。

Int64.ofUInt64
toUInt64 : UInt64

将 64 位有符号整数转换为作为其二进制补码编码的 64 位无符号整数。

20.4.2. 运行时表示🔗

在编译后的代码中,即使上下文要求采用装箱表示,只要某种固定宽度整数类型能装入比平台指针少一位的空间,就始终无需额外分配或间接寻址。 这始终包含 Int8UInt8Int16UInt16。 在 64 位架构上,Int32UInt32 也可以在没有指针的情况下表示。 在 32 位架构上,Int32UInt32 需要一个指向堆上对象的指针。 ISizeUSizeInt64UInt64 在所有架构上都可能需要指针。

尽管通常情况下一些固定宽度整数类型需要装箱,但编译器能够在仅使用特定固定宽度类型而不是多态的代码路径中,(可能在特化阶段之后)在没有装箱或指针间接寻址的情况下表示它们。 这适用于使用这些类型的大多数实际情况:当已知构造子参数、函数参数、函数返回值或中间结果是固定宽度整数类型时,它们的值将使用相应的无符号固定宽度 C 类型来表示。 Lean 运行时系统包含了在归纳类型的构造子中存储固定宽度整数的原语,并且基本操作是在相应的 C 类型上定义的,因此装箱往往发生在整数计算的“边缘”,而不是针对每个中间结果。 在可能出现其他类型的上下文中,例如像 Array 这样的多态容器的内容,这些类型会被装箱,即使静态地知道一个数组只包含单一的固定宽度整数类型。单态数组类型 ByteArray 避免了对 UInt8 数组的装箱。 Lean 不特化归纳类型或数组的表示。 在 Lean 中检查函数的类型不足以确定固定宽度整数值将如何表示,因为装箱的值不会被急切地取消装箱——例如一个从数组中投影出 Int64 的函数返回的是一个装箱的整数值。

20.4.3. 语法🔗

所有的固定宽度整数类型都有 OfNat 实例,这允许在表达式和模式上下文中将数字用作字面量。 有符号类型另外还有 Neg 实例,允许应用求负操作。

固定宽度字面量

对于具有 OfNat 实例的类型,Lean 允许使用十进制和十六进制字面量。 在此示例中,字面量表示法用于定义掩码。

structure Permissions where readable : Bool writable : Bool executable : Bool def Permissions.encode (p : Permissions) : UInt8 := let r := if p.readable then 0x01 else 0 let w := if p.writable then 0x02 else 0 let x := if p.executable then 0x04 else 0 r ||| w ||| x def Permissions.decode (i : UInt8) : Permissions := i &&& 0x01 0, i &&& 0x02 0, i &&& 0x04 0

溢出其类型精度的字面量将被解释为对精度取模。 对于有符号类型,则按底层的二进制补码表示来解释。

溢出固定宽度字面量

以下声明均为真:

example : (255 : UInt8) = 255 := 255 = 255 All goals completed! 🐙 example : (256 : UInt8) = 0 := 256 = 0 All goals completed! 🐙 example : (257 : UInt8) = 1 := 257 = 1 All goals completed! 🐙 example : (0x7f : Int8) = 127 := 127 = 127 All goals completed! 🐙 example : (0x8f : Int8) = -113 := 143 = -113 All goals completed! 🐙 example : (0xff : Int8) = -1 := 255 = -1 All goals completed! 🐙

20.4.4. API 参考🔗

20.4.4.1. 大小🔗

每个固定宽度整数都有一个大小,这是该类型可以表示的不同值的数量。 这不等同于 C 语言的 sizeof 运算符,后者是用来确定该类型占用多少字节的。

🔗定义

USize 可表示的不同值的数量,即 2^System.Platform.numBits

🔗定义

ISize 可表示的不同值的数量,即 2^System.Platform.numBits

🔗定义

UInt8 可表示的不同值的数量,即 2^8 = 256

🔗定义

Int8 可表示的不同值的数量,即 2^8 = 256

🔗定义

UInt16 可表示的不同值的数量,即 2^16 = 65536

🔗定义

Int16 可表示的不同值的数量,即 2^16 = 65536

🔗定义

UInt32 可表示的不同值的数量,即 2^32 = 4294967296

🔗定义

Int32 可表示的不同值的数量,即 2^32 = 4294967296

🔗定义

UInt64 可表示的不同值的数量,即 2^64 = 18446744073709551616

🔗定义

Int64 可表示的不同值的数量,即 2^64 = 18446744073709551616

20.4.4.2. 范围🔗

🔗定义

ISize 可表示的最小数:-2^(System.Platform.numBits - 1)

🔗定义

ISize 可表示的最大数:2^(System.Platform.numBits - 1) - 1

🔗定义

Int8 可表示的最小数:-2^7 = -128

🔗定义

Int8 可表示的最大数:2^7 - 1 = 127

🔗定义

Int16 可表示的最小数:-2^15 = -32768

🔗定义

Int16 可表示的最大数:2^15 - 1 = 32767

🔗定义

Int32 可表示的最小数:-2^31 = -2147483648

🔗定义

Int32 可表示的最大数:2^31 - 1 = 2147483647

🔗定义

Int64 可表示的最小数:-2^63 = -9223372036854775808

🔗定义

Int64 可表示的最大数:2^63 - 1 = 9223372036854775807

20.4.4.3. 转换🔗

20.4.4.3.1. 到/从 Int 转换🔗

🔗定义

将平台字长有符号整数转换为表示同一数值的任意精度整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将8 位有符号整数转换为表示同一数值的任意精度整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将16 位有符号整数转换为表示同一数值的任意精度整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将32 位有符号整数转换为表示同一数值的任意精度整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将64 位有符号整数转换为表示同一数值的任意精度整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将任意精度整数转换为平台字长有符号整数;发生上溢或下溢时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将任意精度整数转换为8 位有符号整数;发生上溢或下溢时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

将任意精度整数转换为16 位有符号整数;发生上溢或下溢时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

将任意精度整数转换为32 位有符号整数;发生上溢或下溢时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

将任意精度整数转换为64 位有符号整数;发生上溢或下溢时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

构造 ISize,输入为 Int;若值过小或过大,则将其钳制到可表示范围内。

🔗定义

构造 Int8,输入为 Int;若值过小或过大,则将其钳制到可表示范围内。

🔗定义

构造 Int16,输入为 Int;若值过小或过大,则将其钳制到可表示范围内。

🔗定义

构造 Int32,输入为 Int;若值过小或过大,则将其钳制到可表示范围内。

🔗定义

构造 Int64,输入为 Int;若值过小或过大,则将其钳制到可表示范围内。

🔗定义

构造 ISize,输入为已知位于范围内的 Int

🔗定义

构造 Int8,输入为已知位于范围内的 Int

🔗定义

构造 Int16,输入为已知位于范围内的 Int

🔗定义

构造 Int32,输入为已知位于范围内的 Int

🔗定义

构造 Int64,输入为已知位于范围内的 Int

20.4.4.3.2. 到/从 Nat 转换🔗

🔗定义

将任意精度自然数转换为平台字长无符号整数;发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将任意精度自然数转换为平台字长有符号整数;发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将自然数转换为8 位无符号整数;发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

将自然数转换为8 位有符号整数;发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

将自然数转换为16 位无符号整数;发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

将自然数转换为16 位有符号整数;发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

将自然数转换为32 位无符号整数;发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

将自然数转换为32 位有符号整数;发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

将自然数转换为64 位无符号整数;发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

将自然数转换为 64 位有符号整数;发生溢出时回绕为负数。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义
USize.ofNat32 (n : Nat) (h : n < 4294967296) : USize
USize.ofNat32 (n : Nat) (h : n < 4294967296) : USize

将自然数转换为 USize。在任何受支持的平台上都不可能溢出,因为 USize.size2^322^64

此函数在运行时会被高效实现覆盖。

🔗定义

将自然数转换为 USize。需要证明该数足够小,因而可以无溢出地表示。

此函数在运行时会被高效实现覆盖。

🔗定义

将自然数转换为 2^8。需要证明该数足够小,因而可以无溢出地表示。

此函数在运行时会被高效实现覆盖。

🔗定义

将自然数转换为 2^16。需要证明该数足够小,因而可以无溢出地表示。

此函数在运行时会被高效实现覆盖。

🔗定义

将自然数转换为 2^32。需要证明该数足够小,因而可以无溢出地表示。

此函数在运行时会被高效实现覆盖。

🔗定义

将自然数转换为 2^64。需要证明该数足够小,因而可以无溢出地表示。

此函数在运行时会被高效实现覆盖。

🔗定义

将自然数转换为 USize;若该数过大,则返回可表示的最大值。

返回 USize.size - 1;依平台而定,该值为 2^64 - 12^32 - 1。这适用于大于等于 USize.size 的自然数。

🔗定义

将自然数转换为8 位无符号整数;若该数过大,则返回可表示的最大值。

对于过大的自然数返回 2^8 - 1;这适用于大于等于 2^8 的自然数。

🔗定义

将自然数转换为16 位无符号整数;若该数过大,则返回可表示的最大值。

对于过大的自然数返回 2^16 - 1;这适用于大于等于 2^16 的自然数。

🔗定义

将自然数转换为32 位无符号整数;若该数过大,则返回可表示的最大值。

对于过大的自然数返回 2^32 - 1;这适用于大于等于 2^32 的自然数。

🔗定义

将自然数转换为64 位无符号整数;若该数过大,则返回可表示的最大值。

对于过大的自然数返回 2^64 - 1;这适用于大于等于 2^64 的自然数。

🔗定义

将平台字长无符号整数转换为任意精度自然数。

此函数在运行时会被高效实现覆盖。

🔗定义

将平台字长有符号整数转换为自然数,并将所有负数映射为 0

若要获得二进制补码表示,请使用 ISize.toBitVec

🔗定义

将8 位无符号整数转换为任意精度自然数。

此函数在运行时会被高效实现覆盖。

🔗定义

将8 位有符号整数转换为自然数,并将所有负数映射为 0

若要获得二进制补码表示,请使用 Int8.toBitVec

🔗定义

将16 位无符号整数转换为任意精度自然数。

此函数在运行时会被高效实现覆盖。

🔗定义

将16 位有符号整数转换为自然数,并将所有负数映射为 0

若要获得二进制补码表示,请使用 Int16.toBitVec

🔗定义

将32 位无符号整数转换为任意精度自然数。

此函数在运行时会被高效实现覆盖。

🔗定义

将32 位有符号整数转换为自然数,并将所有负数映射为 0

若要获得二进制补码表示,请使用 Int32.toBitVec

🔗定义

将64 位无符号整数转换为任意精度自然数。

此函数在运行时会被高效实现覆盖。

🔗定义

将64 位有符号整数转换为自然数,并将所有负数映射为 0

若要获得二进制补码表示,请使用 Int64.toBitVec

20.4.4.3.3. 到其他固定宽度整数转换🔗

🔗定义

将平台字长无符号整数转换为8 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将平台字长无符号整数转换为16 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将平台字长无符号整数转换为32 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将平台字长无符号整数转换为 32 位无符号整数。由于 USize.size2^322^64,此转换不会溢出。

此函数在运行时会被高效实现覆盖。

🔗定义

得到 ISize,它与 USize 二进制补码等价。

🔗定义

得到 Int8,它与 UInt8 二进制补码等价。

🔗定义

将8 位无符号整数转换为16 位无符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将8 位无符号整数转换为32 位无符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将8 位无符号整数转换为64 位无符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将8 位无符号整数转换为平台字长无符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将16 位无符号整数转换为8 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

得到 Int16,它与 UInt16 二进制补码等价。

🔗定义

将16 位无符号整数转换为32 位无符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将16 位无符号整数转换为64 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将16 位无符号整数转换为平台字长无符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将32 位无符号整数转换为8 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将32 位无符号整数转换为16 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

得到 Int32,它与 UInt32 二进制补码等价。

🔗定义

将32 位无符号整数转换为64 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将32 位无符号整数转换为平台字长无符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将64 位无符号整数转换为8 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将64 位无符号整数转换为16 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

将64 位无符号整数转换为32 位无符号整数。发生溢出时回绕。

此函数在运行时会被高效实现覆盖。

🔗定义

得到 Int64,它与 UInt64 二进制补码等价。

🔗定义

将 64 位无符号整数转换为平台字长无符号整数。在 32 位机器上,此转换可能溢出并导致数值回绕(即对 USize.size 取模)。

此函数在运行时会被高效实现覆盖。

🔗定义

通过截断位向量表示,将平台字长有符号整数转换为8 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

通过截断位向量表示,将平台字长有符号整数转换为16 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将平台字长有符号整数转换为 32 位有符号整数。

在 32 位平台上,此转换不会损失信息。在 64 位平台上,该整数的位向量表示会被截断为 32 位。此函数在运行时会被高效实现覆盖。

此函数在运行时会被高效实现覆盖。

🔗定义

将平台字长有符号整数转换为表示同一数值的 64 位有符号整数。由于 ISizeInt32Int64,此转换不会损失信息。

此函数在运行时会被高效实现覆盖。

🔗定义

将8 位有符号整数转换为表示同一数值的16 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将8 位有符号整数转换为表示同一数值的32 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将8 位有符号整数转换为表示同一数值的64 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将8 位有符号整数转换为表示同一数值的平台字长有符号整数。由于 ISizeInt32Int64,此转换不会损失信息。

此函数在运行时会被高效实现覆盖。

🔗定义

通过截断位向量表示,将16 位有符号整数转换为8 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将16 位有符号整数转换为表示同一数值的32 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将16 位有符号整数转换为表示同一数值的64 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将16 位有符号整数转换为表示同一数值的平台字长有符号整数。由于 ISizeInt32Int64,此转换不会损失信息。

此函数在运行时会被高效实现覆盖。

🔗定义

通过截断位向量表示,将32 位有符号整数转换为8 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

通过截断位向量表示,将32 位有符号整数转换为16 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将32 位有符号整数转换为表示同一数值的64 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将32 位有符号整数转换为表示同一数值的平台字长有符号整数。由于 ISizeInt32Int64,此转换不会损失信息。

此函数在运行时会被高效实现覆盖。

🔗定义

通过截断位向量表示,将64 位有符号整数转换为8 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

通过截断位向量表示,将64 位有符号整数转换为16 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

通过截断位向量表示,将64 位有符号整数转换为32 位有符号整数。

此函数在运行时会被高效实现覆盖。

🔗定义

将 64 位有符号整数转换为平台字长有符号整数;在 32 位平台上会截断其位向量表示,在 64 位平台上则不会损失信息。

此函数在运行时会被高效实现覆盖。

20.4.4.3.4. 到浮点数转换🔗

🔗定义

得到 Float,其数值接近给定的 ISize

如果给定 ISize 的数值存在对应的 Float,则返回精确值。如果不存在这样的 Float,则返回大于给定值的最小 Float,或小于给定值的最大 Float

此函数具有基于 Float.Model 的逻辑模型,但在运行时会被高效实现覆盖。

🔗定义

得到 Float32,其数值接近给定的 ISize

如果给定 ISize 的数值存在对应的 Float32,则返回精确值。如果不存在这样的 Float32,则返回大于给定值的最小 Float32,或小于给定值的最大 Float32

此函数具有基于 Float32.Model 的逻辑模型,但在运行时会被高效实现覆盖。

🔗定义

得到 Float,其数值与给定 Int8 相同。

🔗定义

得到 Float32,其数值与给定 Int8 相同。

🔗定义

得到 Float,其数值与给定 Int16 相同。

🔗定义

得到 Float32,其数值与给定 Int16 相同。

🔗定义

得到 Float,其数值与给定 Int32 相同。

🔗定义

得到 Float32,其数值接近给定的 Int32

如果给定 Int32 的数值存在对应的 Float32,则返回精确值。如果不存在这样的 Float32,则返回大于给定值的最小 Float32,或小于给定值的最大 Float32

此函数具有基于 Float32.Model 的逻辑模型,但在运行时会被高效实现覆盖。

🔗定义

得到 Float,其数值接近给定的 Int64

如果给定 Int64 的数值存在对应的 Float,则返回精确值。如果不存在这样的 Float,则返回大于给定值的最小 Float,或小于给定值的最大 Float

此函数具有基于 Float.Model 的逻辑模型,但在运行时会被高效实现覆盖。

🔗定义

得到 Float32,其数值接近给定的 Int64

如果给定 Int64 的数值存在对应的 Float32,则返回精确值。如果不存在这样的 Float32,则返回大于给定值的最小 Float32,或小于给定值的最大 Float32

此函数具有基于 Float32.Model 的逻辑模型,但在运行时会被高效实现覆盖。

🔗定义

得到 Float,其数值接近给定的 USize

如果给定 USize 的数值存在对应的 Float,则返回精确值。如果不存在这样的 Float,则返回大于给定值的最小 Float,或小于给定值的最大 Float

此函数具有基于 Float.Model 的逻辑模型,但在运行时会被高效实现覆盖。

🔗定义

得到 Float32,其数值接近给定的 USize

如果给定 USize 的数值存在对应的 Float32,则返回精确值。如果不存在这样的 Float32,则返回大于给定值的最小 Float32,或小于给定值的最大 Float32

此函数具有基于 Float32.Model 的逻辑模型,但在运行时会被高效实现覆盖。

🔗定义

得到 Float,其数值与给定 UInt8 相同。

🔗定义

得到 Float32,其数值与给定 UInt8 相同。

🔗定义

得到 Float,其数值与给定 UInt16 相同。

🔗定义

得到 Float32,其数值与给定 UInt16 相同。

🔗定义

得到 Float,其数值与给定 UInt32 相同。

🔗定义

得到 Float32,其数值接近给定的 UInt32

如果给定 UInt32 的数值存在对应的 Float32,则返回精确值。如果不存在这样的 Float32,则返回大于给定值的最小 Float32,或小于给定值的最大 Float32

此函数具有基于 Float32.Model 的逻辑模型,但在运行时会被高效实现覆盖。

🔗定义

得到 Float,其数值接近给定的 UInt64

如果给定 UInt64 的数值存在对应的 Float,则返回精确值。如果不存在这样的 Float,则返回大于给定值的最小 Float,或小于给定值的最大 Float

此函数具有基于 Float.Model 的逻辑模型,但在运行时会被高效实现覆盖。

🔗定义

得到 Float32,其数值接近给定的 UInt64

如果给定 UInt64 的数值存在对应的 Float32,则返回精确值。如果不存在这样的 Float32,则返回大于给定值的最小 Float32,或小于给定值的最大 Float32

此函数具有基于 Float32.Model 的逻辑模型,但在运行时会被高效实现覆盖。

20.4.4.3.5. 到/从位向量转换🔗

🔗定义

得到 BitVec,其中包含 ISize 的二进制补码表示。

🔗定义

得到 ISize,其二进制补码表示为给定的 BitVec

🔗定义

得到 BitVec,其中包含 Int8 的二进制补码表示。

🔗定义

得到 Int8,其二进制补码表示为给定的 BitVec 8

🔗定义

得到 BitVec,其中包含 Int16 的二进制补码表示。

🔗定义

得到 Int16,其二进制补码表示为给定的 BitVec 16

🔗定义

得到 BitVec,其中包含 Int32 的二进制补码表示。

🔗定义

得到 Int32,其二进制补码表示为给定的 BitVec 32

🔗定义

得到 BitVec,其中包含 Int64 的二进制补码表示。

🔗定义

得到 Int64,其二进制补码表示为给定的 BitVec 64

20.4.4.3.6. 到/从有限数转换🔗

🔗定义

USize 转换为对应的 Fin USize.size

🔗定义

UInt8 转换为对应的 Fin UInt8.size

🔗定义

UInt16 转换为对应的 Fin UInt16.size

🔗定义

UInt32 转换为对应的 Fin UInt32.size

🔗定义

UInt64 转换为对应的 Fin UInt64.size

🔗定义

Fin USize.size 转换为对应的 USize

🔗定义

Fin UInt8.size 转换为对应的 UInt8

🔗定义

Fin UInt16.size 转换为对应的 UInt16

🔗定义

Fin UInt32.size 转换为对应的 UInt32

🔗定义

Fin UInt64.size 转换为对应的 UInt64

🔗定义

将平台字长无符号整数转换为十进制字符串。

此函数在运行时会被高效实现覆盖。

示例:

20.4.4.3.7. 到字符转换🔗

Char 类型是对 UInt32 的包装器,它需要一个证明,证明所包装的整数表示一个 Unicode 代码点。 该谓词是 UInt32 API 的一部分。

🔗定义

如果 UInt32 小于 0x110000,并且不是代理代码点(从 0xd8000xdfff 的闭区间),那么它表示有效的 Unicode 码点。

20.4.4.4. 比较🔗

本节中的运算符很少通过名称调用。 通常,定宽整数上的比较操作应该使用相应关系的可判定性,这些关系由相等类型 Eq 以及在 LELT 实例中实现的关系组成。

🔗定义
USize.le (a b : USize) : Prop
USize.le (a b : USize) : Prop

字大小无符号整数的非严格不等式,定义为相应自然数的不等式。通常通过 运算符访问。

🔗定义
ISize.le (a b : ISize) : Prop
ISize.le (a b : ISize) : Prop

字长有符号整数的非严格不等式,定义为相应整数的不等式。通常通过 运算符访问。

🔗定义
UInt8.le (a b : UInt8) : Prop
UInt8.le (a b : UInt8) : Prop

8 位无符号整数的非严格不等式,定义为相应自然数的不等式。通常通过 运算符访问。

🔗定义
Int8.le (a b : Int8) : Prop
Int8.le (a b : Int8) : Prop

8 位有符号整数的非严格不等式,定义为相应整数的不等式。通常通过 运算符访问。

🔗定义
UInt16.le (a b : UInt16) : Prop
UInt16.le (a b : UInt16) : Prop

16 位无符号整数的非严格不等式,定义为相应自然数的不等式。通常通过 运算符访问。

🔗定义
Int16.le (a b : Int16) : Prop
Int16.le (a b : Int16) : Prop

16 位有符号整数的非严格不等式,定义为相应整数的不等式。通常通过 运算符访问。

🔗定义
UInt32.le (a b : UInt32) : Prop
UInt32.le (a b : UInt32) : Prop

32 位无符号整数的非严格不等式,定义为相应自然数的不等式。通常通过 运算符访问。

🔗定义
Int32.le (a b : Int32) : Prop
Int32.le (a b : Int32) : Prop

32 位有符号整数的非严格不等式,定义为相应整数的不等式。通常通过 运算符访问。

🔗定义
UInt64.le (a b : UInt64) : Prop
UInt64.le (a b : UInt64) : Prop

64 位无符号整数的非严格不等式,定义为相应自然数的不等式。通常通过 运算符访问。

🔗定义
Int64.le (a b : Int64) : Prop
Int64.le (a b : Int64) : Prop

64 位有符号整数的非严格不等式,定义为相应整数的不等式。通常通过 运算符访问。

🔗定义
USize.lt (a b : USize) : Prop
USize.lt (a b : USize) : Prop

字长无符号整数的严格不等式,定义为相应自然数的不等式。通常通过 < 运算符访问。

🔗定义
ISize.lt (a b : ISize) : Prop
ISize.lt (a b : ISize) : Prop

字长有符号整数的严格不等式,定义为相应整数的不等式。通常通过 < 运算符访问。

🔗定义
UInt8.lt (a b : UInt8) : Prop
UInt8.lt (a b : UInt8) : Prop

8 位无符号整数的严格不等式,定义为相应自然数的不等式。通常通过 < 运算符访问。

🔗定义
Int8.lt (a b : Int8) : Prop
Int8.lt (a b : Int8) : Prop

8 位有符号整数的严格不等式,定义为相应整数的不等式。通常通过 < 运算符访问。

🔗定义
UInt16.lt (a b : UInt16) : Prop
UInt16.lt (a b : UInt16) : Prop

16位无符号整数的严格不等式,定义为相应自然数的不等式。通常通过 < 运算符访问。

🔗定义
Int16.lt (a b : Int16) : Prop
Int16.lt (a b : Int16) : Prop

16 位有符号整数的严格不等式,定义为相应整数的不等式。通常通过 < 运算符访问。

🔗定义
UInt32.lt (a b : UInt32) : Prop
UInt32.lt (a b : UInt32) : Prop

32位无符号整数的严格不等式,定义为相应自然数的不等式。通常通过 < 运算符访问。

🔗定义
Int32.lt (a b : Int32) : Prop
Int32.lt (a b : Int32) : Prop

32 位有符号整数的严格不等式,定义为相应整数的不等式。通常通过 < 运算符访问。

🔗定义
UInt64.lt (a b : UInt64) : Prop
UInt64.lt (a b : UInt64) : Prop

64位无符号整数的严格不等式,定义为相应自然数的不等式。通常通过 < 运算符访问。

🔗定义
Int64.lt (a b : Int64) : Prop
Int64.lt (a b : Int64) : Prop

64 位有符号整数的严格不等式,定义为相应整数的不等式。通常通过 < 运算符访问。

🔗定义

决定两个字大小的无符号整数是否相等。通常通过 DecidableEq USize 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定两个字大小的有符号整数是否相等。通常通过 DecidableEq ISize 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

判断两个 8 位无符号整数是否相等。通常通过 DecidableEq UInt8 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

判断两个 8 位有符号整数是否相等。通常通过 DecidableEq Int8 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

判断两个 16 位无符号整数是否相等。通常通过 DecidableEq UInt16 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

判断两个 16 位有符号整数是否相等。通常通过 DecidableEq Int16 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

判断两个 32 位无符号整数是否相等。通常通过 DecidableEq UInt32 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定两个 32 位有符号整数是否相等。通常通过 DecidableEq Int32 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

判断两个 64 位无符号整数是否相等。通常通过 DecidableEq UInt64 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定两个 64 位有符号整数是否相等。通常通过 DecidableEq Int64 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个字大小的无符号整数是否小于或等于另一个字大小的无符号整数。通常通过 DecidableLE USize 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个字大小的有符号整数是否小于或等于另一个字大小的有符号整数。通常通过 DecidableLE ISize 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 8 位无符号整数是否小于或等于另一个。通常通过 DecidableLE UInt8 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 8 位有符号整数是否小于或等于另一个。通常通过 DecidableLE Int8 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 16 位无符号整数是否小于或等于另一个。通常通过 DecidableLE UInt16 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 16 位有符号整数是否小于或等于另一个。通常通过 DecidableLE Int16 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 32 位有符号整数是否小于或等于另一个。通常通过 DecidableLE UInt32 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 32 位有符号整数是否小于或等于另一个。通常通过 DecidableLE Int32 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 64 位无符号整数是否小于或等于另一个。通常通过 DecidableLE UInt64 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 8 位有符号整数是否小于或等于另一个。通常通过 DecidableLE Int64 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个字大小的无符号整数是否严格小于另一个字大小的无符号整数。通常通过 DecidableLT USize 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个字大小的有符号整数是否严格小于另一个字大小的有符号整数。通常通过 DecidableLT ISize 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 8 位无符号整数是否严格小于另一个。通常通过 DecidableLT UInt8 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 8 位有符号整数是否严格小于另一个。通常通过 DecidableLT Int8 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 16 位无符号整数是否严格小于另一个。通常通过 DecidableLT UInt16 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 16 位有符号整数是否严格小于另一个。通常通过 DecidableLT Int16 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 8 位无符号整数是否严格小于另一个。通常通过 DecidableLT UInt32 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 32 位有符号整数是否严格小于另一个。通常通过 DecidableLT Int32 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 64 位无符号整数是否严格小于另一个。通常通过 DecidableLT UInt64 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

🔗定义

确定一个 8 位有符号整数是否严格小于另一个。通常通过 DecidableLT Int64 实例访问。

该函数在运行时被有效的实现覆盖。

示例:

20.4.4.5. 算术🔗

通常,定宽整数上的算术运算应通过 Lean 的重载算术记号来使用,尤其是它们的 AddSubMulDivMod 实例,以及有符号类型的 Neg 实例。

🔗定义

对字长有符号整数取负。通常通过前缀运算符 - 使用。

此函数在运行时会被高效实现覆盖。

🔗定义

对8 位有符号整数取负。通常通过前缀运算符 - 使用。

此函数在运行时会被高效实现覆盖。

🔗定义

对16 位有符号整数取负。通常通过前缀运算符 - 使用。

此函数在运行时会被高效实现覆盖。

🔗定义

对32 位有符号整数取负。通常通过前缀运算符 - 使用。

此函数在运行时会被高效实现覆盖。

🔗定义

对64 位有符号整数取负。通常通过前缀运算符 - 使用。

此函数在运行时会被高效实现覆盖。

🔗定义

对字长无符号整数取负,结果按 USize.size 取模。

此函数在运行时会被高效实现覆盖。

🔗定义

对8 位无符号整数取负,结果按 UInt8.size 取模。

UInt8.neg a 等价于 255 - a + 1

此函数在运行时会被高效实现覆盖。

🔗定义

对16 位无符号整数取负,结果按 UInt16.size 取模。

UInt16.neg a 等价于 65_535 - a + 1

此函数在运行时会被高效实现覆盖。

🔗定义

对32 位无符号整数取负,结果按 UInt32.size 取模。

UInt32.neg a 等价于 429_4967_295 - a + 1

此函数在运行时会被高效实现覆盖。

🔗定义

对64 位无符号整数取负,结果按 UInt64.size 取模。

UInt64.neg a 等价于 18_446_744_073_709_551_615 - a + 1

此函数在运行时会被高效实现覆盖。

🔗定义

将两个字长无符号整数相加,在溢出时回绕。通常通过 + 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个字长有符号整数相加,在溢出或下溢时回绕。通常通过 + 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个8 位无符号整数相加,在溢出时回绕。通常通过 + 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义
Int8.add (a b : Int8) : Int8
Int8.add (a b : Int8) : Int8

将两个8 位有符号整数相加,在溢出或下溢时回绕。通常通过 + 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个16 位无符号整数相加,在溢出时回绕。通常通过 + 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个16 位有符号整数相加,在溢出或下溢时回绕。通常通过 + 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个32 位无符号整数相加,在溢出时回绕。通常通过 + 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个32 位有符号整数相加,在溢出或下溢时回绕。通常通过 + 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个64 位无符号整数相加,在溢出时回绕。通常通过 + 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个64 位有符号整数相加,在溢出或下溢时回绕。通常通过 + 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

从另一个字长无符号整数中减去一个整数,在下溢时回绕。通常通过 - 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

从另一个字长有符号整数中减去一个整数,在溢出或下溢时回绕。通常通过 - 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

从另一个8 位无符号整数中减去一个整数,在下溢时回绕。通常通过 - 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义
Int8.sub (a b : Int8) : Int8
Int8.sub (a b : Int8) : Int8

从另一个8 位有符号整数中减去一个整数,在溢出或下溢时回绕。通常通过 - 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

从另一个16 位无符号整数中减去一个整数,在下溢时回绕。通常通过 - 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

从另一个16 位有符号整数中减去一个整数,在溢出或下溢时回绕。通常通过 - 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

从另一个32 位无符号整数中减去一个整数,在下溢时回绕。通常通过 - 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

从另一个32 位有符号整数中减去一个整数,在溢出或下溢时回绕。通常通过 - 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

从另一个64 位无符号整数中减去一个整数,在下溢时回绕。通常通过 - 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

从另一个64 位有符号整数中减去一个整数,在溢出或下溢时回绕。通常通过 - 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个字长无符号整数相乘,在溢出时回绕。通常通过 * 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个字长有符号整数相乘,在溢出或下溢时回绕。通常通过 * 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个8 位无符号整数相乘,在溢出时回绕。通常通过 * 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义
Int8.mul (a b : Int8) : Int8
Int8.mul (a b : Int8) : Int8

将两个8 位有符号整数相乘,在溢出或下溢时回绕。通常通过 * 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个16 位无符号整数相乘,在溢出时回绕。通常通过 * 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个16 位有符号整数相乘,在溢出或下溢时回绕。通常通过 * 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个32 位无符号整数相乘,在溢出时回绕。通常通过 * 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个32 位有符号整数相乘,在溢出或下溢时回绕。通常通过 * 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个64 位无符号整数相乘,在溢出时回绕。通常通过 * 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

将两个64 位有符号整数相乘,在溢出或下溢时回绕。通常通过 * 运算符使用。

此函数在运行时会被高效实现覆盖。

🔗定义

字长无符号整数的无符号除法,舍弃余数。通常通过 / 运算符使用。

此操作有时称为“向下取整除法”。除以零的结果定义为零。

此函数在运行时会被高效实现覆盖。

🔗定义

字长有符号整数的截断除法,向零取整。通常通过 / 运算符使用。

除以零的结果定义为零。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

8 位无符号整数的无符号除法,舍弃余数。通常通过 / 运算符使用。

此操作有时称为“向下取整除法”。除以零的结果定义为零。

此函数在运行时会被高效实现覆盖。

🔗定义
Int8.div (a b : Int8) : Int8
Int8.div (a b : Int8) : Int8

8 位有符号整数的截断除法,向零取整。通常通过 / 运算符使用。

除以零的结果定义为零。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

16 位无符号整数的无符号除法,舍弃余数。通常通过 / 运算符使用。

此操作有时称为“向下取整除法”。除以零的结果定义为零。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位有符号整数的截断除法,向零取整。通常通过 / 运算符使用。

除以零的结果定义为零。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

32 位无符号整数的无符号除法,舍弃余数。通常通过 / 运算符使用。

此操作有时称为“向下取整除法”。除以零的结果定义为零。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位有符号整数的截断除法,向零取整。通常通过 / 运算符使用。

除以零的结果定义为零。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

64 位无符号整数的无符号除法,舍弃余数。通常通过 / 运算符使用。

此操作有时称为“向下取整除法”。除以零的结果定义为零。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位有符号整数的截断除法,向零取整。通常通过 / 运算符使用。

除以零的结果定义为零。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

字长无符号整数的取模运算,计算一个整数除以另一个整数的余数。通常通过 % 运算符使用。

当除数为 0 时,结果为被除数,而不是报错。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

字长有符号整数的取模运算,按 ISize.div 所用的向零取整约定计算一个整数除以另一个整数的余数。通常通过 % 运算符使用。

当除数为 0 时,结果为被除数,而不是报错。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

8 位无符号整数的取模运算,计算一个整数除以另一个整数的余数。通常通过 % 运算符使用。

当除数为 0 时,结果为被除数,而不是报错。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义
Int8.mod (a b : Int8) : Int8
Int8.mod (a b : Int8) : Int8

8 位有符号整数的取模运算,按 Int8.div 所用的向零取整约定计算一个整数除以另一个整数的余数。通常通过 % 运算符使用。

当除数为 0 时,结果为被除数,而不是报错。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

16 位无符号整数的取模运算,计算一个整数除以另一个整数的余数。通常通过 % 运算符使用。

当除数为 0 时,结果为被除数,而不是报错。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

16 位有符号整数的取模运算,按 Int16.div 所用的向零取整约定计算一个整数除以另一个整数的余数。通常通过 % 运算符使用。

当除数为 0 时,结果为被除数,而不是报错。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

32 位无符号整数的取模运算,计算一个整数除以另一个整数的余数。通常通过 % 运算符使用。

当除数为 0 时,结果为被除数,而不是报错。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

32 位有符号整数的取模运算,按 Int32.div 所用的向零取整约定计算一个整数除以另一个整数的余数。通常通过 % 运算符使用。

当除数为 0 时,结果为被除数,而不是报错。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

64 位无符号整数的取模运算,计算一个整数除以另一个整数的余数。通常通过 % 运算符使用。

当除数为 0 时,结果为被除数,而不是报错。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

64 位有符号整数的取模运算,按 Int64.div 所用的向零取整约定计算一个整数除以另一个整数的余数。通常通过 % 运算符使用。

当除数为 0 时,结果为被除数,而不是报错。

此函数在运行时会被高效实现覆盖。

示例:

🔗定义

字长无符号整数的以 2 为底的对数。返回 ⌊max 0 (log₂ a)⌋

此函数在运行时会被高效实现覆盖。此定义是其逻辑模型。

示例:

🔗定义

8 位无符号整数的以 2 为底的对数。返回 ⌊max 0 (log₂ a)⌋

此函数在运行时会被高效实现覆盖。此定义是其逻辑模型。

示例:

🔗定义

16 位无符号整数的以 2 为底的对数。返回 ⌊max 0 (log₂ a)⌋

此函数在运行时会被高效实现覆盖。此定义是其逻辑模型。

示例:

🔗定义

32 位无符号整数的以 2 为底的对数。返回 ⌊max 0 (log₂ a)⌋

此函数在运行时会被高效实现覆盖。此定义是其逻辑模型。

示例:

🔗定义

64 位无符号整数的以 2 为底的对数。返回 ⌊max 0 (log₂ a)⌋

此函数在运行时会被高效实现覆盖。此定义是其逻辑模型。

示例:

🔗定义

计算字长有符号整数的绝对值。

此函数等价于 if a < 0 then -a else a,因此特别地,ISize.minValue 会映射到 ISize.minValue

此函数在运行时会被高效实现覆盖。

🔗定义

计算8 位有符号整数的绝对值。

此函数等价于 if a < 0 then -a else a,因此特别地,Int8.minValue 会映射到 Int8.minValue

此函数在运行时会被高效实现覆盖。

🔗定义

计算16 位有符号整数的绝对值。

此函数等价于 if a < 0 then -a else a,因此特别地,Int16.minValue 会映射到 Int16.minValue

此函数在运行时会被高效实现覆盖。

🔗定义

计算32 位有符号整数的绝对值。

此函数等价于 if a < 0 then -a else a,因此特别地,Int32.minValue 会映射到 Int32.minValue

此函数在运行时会被高效实现覆盖。

🔗定义

计算64 位有符号整数的绝对值。

此函数等价于 if a < 0 then -a else a,因此特别地,Int64.minValue 会映射到 Int64.minValue

此函数在运行时会被高效实现覆盖。

20.4.4.6. 按位操作🔗

通常,对固定宽度整数的按位操作应该使用 Lean 的重载运算符来访问,特别是它们对 ShiftLeftShiftRightAndOpOrOpXorOp 的实例。

🔗定义

平台字长无符号整数的按位与。通常通过 &&& 运算符访问。

仅当两个输入整数的对应位都为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长有符号整数的按位与。通常通过 &&& 运算符访问。

按照二进制补码表示,仅当两个输入整数的对应位都为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

8 位无符号整数的按位与。通常通过 &&& 运算符访问。

仅当两个输入整数的对应位都为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义
Int8.land (a b : Int8) : Int8
Int8.land (a b : Int8) : Int8

8 位有符号整数的按位与。通常通过 &&& 运算符访问。

按照二进制补码表示,仅当两个输入整数的对应位都为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位无符号整数的按位与。通常通过 &&& 运算符访问。

仅当两个输入整数的对应位都为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位有符号整数的按位与。通常通过 &&& 运算符访问。

按照二进制补码表示,仅当两个输入整数的对应位都为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位无符号整数的按位与。通常通过 &&& 运算符访问。

仅当两个输入整数的对应位都为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位有符号整数的按位与。通常通过 &&& 运算符访问。

按照二进制补码表示,仅当两个输入整数的对应位都为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位无符号整数的按位与。通常通过 &&& 运算符访问。

仅当两个输入整数的对应位都为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位有符号整数的按位与。通常通过 &&& 运算符访问。

按照二进制补码表示,仅当两个输入整数的对应位都为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长无符号整数的按位或。通常通过 ||| 运算符访问。

只要输入整数的对应位中至少有一个为 1,结果整数的该位就为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长有符号整数的按位或。通常通过 ||| 运算符访问。

按照二进制补码表示,只要输入整数的对应位中至少有一个为 1,结果整数的该位就为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

8 位无符号整数的按位或。通常通过 ||| 运算符访问。

只要输入整数的对应位中至少有一个为 1,结果整数的该位就为 1。

此函数在运行时会被高效实现覆盖。

🔗定义
Int8.lor (a b : Int8) : Int8
Int8.lor (a b : Int8) : Int8

8 位有符号整数的按位或。通常通过 ||| 运算符访问。

按照二进制补码表示,只要输入整数的对应位中至少有一个为 1,结果整数的该位就为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位无符号整数的按位或。通常通过 ||| 运算符访问。

只要输入整数的对应位中至少有一个为 1,结果整数的该位就为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位有符号整数的按位或。通常通过 ||| 运算符访问。

按照二进制补码表示,只要输入整数的对应位中至少有一个为 1,结果整数的该位就为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位无符号整数的按位或。通常通过 ||| 运算符访问。

只要输入整数的对应位中至少有一个为 1,结果整数的该位就为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位有符号整数的按位或。通常通过 ||| 运算符访问。

按照二进制补码表示,只要输入整数的对应位中至少有一个为 1,结果整数的该位就为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位无符号整数的按位或。通常通过 ||| 运算符访问。

只要输入整数的对应位中至少有一个为 1,结果整数的该位就为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位有符号整数的按位或。通常通过 ||| 运算符访问。

按照二进制补码表示,只要输入整数的对应位中至少有一个为 1,结果整数的该位就为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长无符号整数的按位异或。通常通过 ^^^ 运算符访问。

仅当两个输入整数的对应位中恰有一个为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长有符号整数的按位异或。通常通过 ^^^ 运算符访问。

按照二进制补码表示,仅当两个输入整数的对应位中恰有一个为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

8 位无符号整数的按位异或。通常通过 ^^^ 运算符访问。

仅当两个输入整数的对应位中恰有一个为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义
Int8.xor (a b : Int8) : Int8
Int8.xor (a b : Int8) : Int8

8 位有符号整数的按位异或。通常通过 ^^^ 运算符访问。

按照二进制补码表示,仅当两个输入整数的对应位中恰有一个为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位无符号整数的按位异或。通常通过 ^^^ 运算符访问。

仅当两个输入整数的对应位中恰有一个为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位有符号整数的按位异或。通常通过 ^^^ 运算符访问。

按照二进制补码表示,仅当两个输入整数的对应位中恰有一个为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位无符号整数的按位异或。通常通过 ^^^ 运算符访问。

仅当两个输入整数的对应位中恰有一个为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位有符号整数的按位异或。通常通过 ^^^ 运算符访问。

按照二进制补码表示,仅当两个输入整数的对应位中恰有一个为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位无符号整数的按位异或。通常通过 ^^^ 运算符访问。

仅当两个输入整数的对应位中恰有一个为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位有符号整数的按位异或。通常通过 ^^^ 运算符访问。

按照二进制补码表示,仅当两个输入整数的对应位中恰有一个为 1 时,结果整数的该位才为 1。

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长无符号整数的按位补码(也称按位取反)。通常通过 ~~~ 运算符访问。

结果整数的每一位都与输入整数的对应位相反。

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长有符号整数的按位补码(也称按位取反)。通常通过 ~~~ 运算符访问。

结果整数的每一位都与输入整数的对应位相反。整数使用二进制补码表示,因此 ISize.complement a = -(a + 1)

此函数在运行时会被高效实现覆盖。

🔗定义

8 位无符号整数的按位补码(也称按位取反)。通常通过 ~~~ 运算符访问。

结果整数的每一位都与输入整数的对应位相反。

此函数在运行时会被高效实现覆盖。

🔗定义

8 位有符号整数的按位补码(也称按位取反)。通常通过 ~~~ 运算符访问。

结果整数的每一位都与输入整数的对应位相反。整数使用二进制补码表示,因此 Int8.complement a = -(a + 1)

此函数在运行时会被高效实现覆盖。

🔗定义

16 位无符号整数的按位补码(也称按位取反)。通常通过 ~~~ 运算符访问。

结果整数的每一位都与输入整数的对应位相反。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位有符号整数的按位补码(也称按位取反)。通常通过 ~~~ 运算符访问。

结果整数的每一位都与输入整数的对应位相反。整数使用二进制补码表示,因此 Int16.complement a = -(a + 1)

此函数在运行时会被高效实现覆盖。

🔗定义

32 位无符号整数的按位补码(也称按位取反)。通常通过 ~~~ 运算符访问。

结果整数的每一位都与输入整数的对应位相反。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位有符号整数的按位补码(也称按位取反)。通常通过 ~~~ 运算符访问。

结果整数的每一位都与输入整数的对应位相反。整数使用二进制补码表示,因此 Int32.complement a = -(a + 1)

此函数在运行时会被高效实现覆盖。

🔗定义

64 位无符号整数的按位补码(也称按位取反)。通常通过 ~~~ 运算符访问。

结果整数的每一位都与输入整数的对应位相反。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位有符号整数的按位补码(也称按位取反)。通常通过 ~~~ 运算符访问。

结果整数的每一位都与输入整数的对应位相反。整数使用二进制补码表示,因此 Int64.complement a = -(a + 1)

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长无符号整数的按位左移。通常通过 <<< 运算符访问。

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长有符号整数的按位左移。通常通过 <<< 运算符访问。

有符号整数按照二进制补码表示解释为位向量。

此函数在运行时会被高效实现覆盖。

🔗定义

8 位无符号整数的按位左移。通常通过 <<< 运算符访问。

此函数在运行时会被高效实现覆盖。

🔗定义

8 位有符号整数的按位左移。通常通过 <<< 运算符访问。

有符号整数按照二进制补码表示解释为位向量。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位无符号整数的按位左移。通常通过 <<< 运算符访问。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位有符号整数的按位左移。通常通过 <<< 运算符访问。

有符号整数按照二进制补码表示解释为位向量。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位无符号整数的按位左移。通常通过 <<< 运算符访问。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位有符号整数的按位左移。通常通过 <<< 运算符访问。

有符号整数按照二进制补码表示解释为位向量。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位无符号整数的按位左移。通常通过 <<< 运算符访问。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位有符号整数的按位左移。通常通过 <<< 运算符访问。

有符号整数按照二进制补码表示解释为位向量。

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长无符号整数的按位右移。通常通过 >>> 运算符访问。

此函数在运行时会被高效实现覆盖。

🔗定义

平台字长有符号整数的算术右移。通常通过 <<< 运算符访问。

高位用最高有效位的值填充。

此函数在运行时会被高效实现覆盖。

🔗定义

8 位无符号整数的按位右移。通常通过 >>> 运算符访问。

此函数在运行时会被高效实现覆盖。

🔗定义

8 位有符号整数的算术右移。通常通过 <<< 运算符访问。

高位用最高有效位的值填充。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位无符号整数的按位右移。通常通过 >>> 运算符访问。

此函数在运行时会被高效实现覆盖。

🔗定义

16 位有符号整数的算术右移。通常通过 <<< 运算符访问。

高位用最高有效位的值填充。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位无符号整数的按位右移。通常通过 >>> 运算符访问。

此函数在运行时会被高效实现覆盖。

🔗定义

32 位有符号整数的算术右移。通常通过 <<< 运算符访问。

高位用最高有效位的值填充。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位无符号整数的按位右移。通常通过 >>> 运算符访问。

此函数在运行时会被高效实现覆盖。

🔗定义

64 位有符号整数的算术右移。通常通过 <<< 运算符访问。

高位用最高有效位的值填充。

此函数在运行时会被高效实现覆盖。