- 文档
- 知识库
- 教程
- OpenHarmony
【免费下载链接】CangjieCorpus
本仓库为仓颉编程语言语料库,聚焦 仓颉编程语言 核心知识体系,整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源,经结构化处理与专业标注,构建为支持 RAG(检索增强生成)技术 的高质量知识基座,适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用,推动鸿蒙开发生态智能化升级!
BigInt是仓颉std.math.numeric包提供的任意精度有符号整数类型,用于承载超出Int8/Int16/Int32/Int64等基础整型范围的数值计算。本篇以 math_numeric_samples/bigInt_basic_prop.md 中的示例为主线,深入讲解初始化BigInt后如何查询其两个核心基本属性sign与bitLen,并结合标准库 API 文档解释它们的取值规则、边界行为与典型应用场景。
BigInt 与 std.math.numeric 包概览
BigInt位于std.math.numeric包中。根据 math_numeric_package_overview.md 的介绍,math.numeric包为「基础类型可表达范围之外」的数值场景提供扩展能力:
- 支持大整数
BigInt; - 支持高精度十进制数
Decimal; - 提供常见数学运算能力与高精度运算规则。
从 math_numeric_package_api/math_numeric_package_structs.md 中的类型定义可以看到:
public struct BigInt <: Comparable<BigInt> & Hashable & ToString { // 多种重载构造函数,如 init(n: Int8~Int64, UInt8~UInt64, Float16~Float64 等) // 属性:prop bitLen: Int64、prop sign: Int64 // 方法:parse / tryParse、divAndMod、modPow、setBit / testBit 等 }BigInt实现了Comparable<BigInt>、Hashable、ToString三个接口,因此它天然支持大小比较、哈希计算和字符串化输出。其任意精度特性意味着它可以表示任意大的整数,而不会像基础整型那样发生溢出;sign与bitLen正是描述一个任意精度整数「正负符号」和「规模量级」的两个基础属性。
基本属性示例:初始化并查询 sign 与 bitLen
原示例文档给出了一段可直接运行的仓颉程序,用于演示如何初始化一个BigInt并查询其基本属性:
import std.math.numeric.* main() { let int = BigInt.parse("-123456") println("BigInt: ${int}") println("BigInt sign: ${int.sign}") println("BigInt bitLen: ${int.bitLen}") return 0 }运行结果:
BigInt: -123456 BigInt sign: -1 BigInt bitLen: 18这段程序展示了三个关键操作:
- 初始化:通过
BigInt.parse("-123456")将十进制字符串"-123456"解析为BigInt对象; - 查询符号:访问
int.sign,得到-1,表示该BigInt为负数; - 查询位长:访问
int.bitLen,得到18,表示表示该值所需的最短二进制位数为 18 位。
接下来我们分别深入剖析这两个属性。
属性 sign:获取 BigInt 的符号
根据 math_numeric_package_structs.md 中prop sign的定义:
public prop sign: Int64功能:获取此BigInt的符号,返回值类型为Int64。取值规则如下:
- 正数返回
1; - 0返回
0; - 负数返回
-1。
该属性的官方示例验证了三种取值:
import std.math.numeric.BigInt main() { let bigInt1 = BigInt(-3) let sign1 = bigInt1.sign println(sign1) let bigInt2 = BigInt(3) let sign2 = bigInt2.sign println(sign2) let bigInt3 = BigInt(0) let sign3 = bigInt3.sign println(sign3) }运行结果:
-1 1 0从该示例可以看到,sign并非简单的布尔值(是正还是负),而是三态取值:-1 / 0 / 1,恰好对应负、零、正三种状态。这种设计使得sign可以直接用于符号相关运算,例如构造x.sign * abs(x)恢复原值、在数值算法中根据符号分支处理等。由于它是Int64类型,也便于与基础整型的算术逻辑互操作。
需要特别说明的是:BigInt的0是唯一一个sign == 0的值,且0只有「非负」一种表示(这与其构造函数init(sign: Bool, magnitude: Array<Byte>)中「当sign为false且传入的数组为 0 时抛IllegalArgumentException」的约束一致)。
属性 bitLen:获取最短 bit 长度
根据 math_numeric_package_structs.md 中prop bitLen的定义:
public prop bitLen: Int64功能:获取此BigInt的最短 bit 长度,返回值类型为Int64。官方文档给出的示例说明如下:
-3(二进制101)返回3;-1(二进制11)返回2;0(二进制0)返回1。
对应示例代码:
import std.math.numeric.BigInt main() { let bigInt1 = BigInt(-3) let bitLen1 = bigInt1.bitLen println(bitLen1) let bigInt2 = BigInt(-1) let bitLen2 = bigInt2.bitLen println(bitLen2) let bigInt3 = BigInt(0) let bitLen3 = bigInt3.bitLen println(bitLen3) }运行结果:
3 2 1理解bitLen需要抓住两个要点:
- 最短 bit 长度:它统计的是「表示该数所需的最短二进制位数」,不包含冗余的前导 0。正数取其二进制原码的有效位数;负数取其二进制补码(或绝对值)的表示位数;
0由于其二进制表示为单比特0,因此bitLen为1。 - 量级指示:
bitLen直接反映了一个BigInt的规模量级。bitLen越大,说明该整数的二进制位数越多,绝对值也越大。
回到原示例,BigInt.parse("-123456")的bitLen为18。可以验证:2^16 = 65536、2^17 = 131072,而123456介于2^17与2^18之间,因此表示它需要 18 位二进制,这与运行结果一致。bitLen常用于:
- 估算存储规模:判断一个
BigInt需要多少字节存储; - 算法复杂度预估:大数运算(乘法、模幂等)的时间复杂度通常与位长相关;
- 随机数生成与素数生成:
BigInt提供init(sign: Bool, bitLen: Int64, rand!: Random)与静态方法randomProbablePrime(bitLen, certainty, rand)等 API,均以bitLen作为规模参数,此时属性bitLen可用于检查已生成数值的规模是否符合预期。
更多初始化方式与属性上下文
原示例中通过BigInt.parse("-123456")完成初始化。事实上BigInt提供了非常丰富的初始化入口(详见 math_numeric_package_structs.md 的构造函数列表),理解这些入口有助于在不同场景下正确构造BigInt并查询其属性:
| 初始化方式 | 签名 | 说明 |
|---|---|---|
| 字符串解析 | parse(value: String) | 支持符号前缀与0b/0o/0x进制前缀,默认十进制 |
| 指定进制解析 | parse(value: String, radix!: Int) | 支持 2~36 进制;另有tryParse变体在失败时返回?BigInt(即None) |
| 基础整型 | init(n: Int8 ... Int64, UInt8 ... UInt64, IntNative, UIntNative) | 从各宽度有/无符号整型直接构造 |
| 浮点类型 | init(n: Float16/32/64) | 向零取整丢弃小数部分;Inf/NaN抛IllegalArgumentException |
| 字节数组 | init(bytes: Array<Byte>) | 大端二进制补码数组;空数组抛异常 |
| 符号 + 绝对值 | init(sign: Bool, magnitude: Array<Byte>) | sign=true非负;sign=false且数组为 0 时抛异常 |
| 随机生成 | init(sign: Bool, bitLen: Int64, rand!: Random = Random()) | 按指定正负与 bit 长度上限生成随机BigInt |
例如,从Int64构造后查询属性:
import std.math.numeric.BigInt main() { let bigInt = BigInt(-24) println("sign=${bigInt.sign}, bitLen=${bigInt.bitLen}") // 输出:sign=-1, bitLen=6 return 0 }-24的二进制表示为11000(补码考虑符号扩展为 6 位),因此bitLen为 6,sign为-1。
另外,与sign、bitLen配套的还有toString()(十进制字符串)、toString(radix: Int)(2~36 进制字符串)以及toBytes()(大端补码字节数组,供序列化/网络传输使用)等输出能力,可用于校验属性查询结果。例如原示例中println("BigInt: ${int}")输出的-123456正是通过ToString接口的字符串表示完成的。
属性在类型转换与溢出策略中的延伸应用
sign与bitLen的价值不只在于「查看」。在实际工程中,BigInt常常需要与基础整型互相转换,而转换过程的溢出行为由 OverflowStrategy 枚举控制:
public enum OverflowStrategy <: Equatable<OverflowStrategy> & ToString { | Saturating | Throwing | Wrapping }三种策略的语义(见 math_numeric_package_enums.md):
Saturating:溢出时饱和到目标类型的 MAX/MIN 边界值;Throwing:溢出时抛出OverflowException(默认策略);Wrapping:溢出时高位截断。
转换 API 形如toInt64(overflowHandling!: OverflowStrategy = Throwing)、toUInt32(...)、toFloat64()等。此时:
sign可用于在转换前快速判断结果可能的正负方向,从而选择合理的溢出策略(例如将负数饱和截断到无符号类型时结果将为 0);bitLen可用于在转换前预估当前值是否超出目标类型的位宽(例如bitLen大于目标类型位宽时,可预期发生溢出),从而提前决定使用Saturating、Wrapping还是Throwing。
一个典型的转换示例(源自 API 文档,Saturating策略):
import std.math.numeric.BigInt import std.math.numeric.OverflowStrategy main() { let bigInt = BigInt(0x8000_0000_0000) let toInt16 = bigInt.toInt16(overflowHandling: Saturating) println(toInt16) // 输出:32767(Int16.MAX) return 0 }该示例中,bigInt的规模远超Int16的 16 位位宽,在Saturating策略下被饱和到Int16.MAX(32767)。可以看到,bitLen描述的规模信息正是溢出判断的核心依据。
小结
sign与bitLen是仓颉BigInt最基本的两个属性:
sign以三态取值(-1/0/1)描述整数的正负符号,是符号相关分支逻辑的直接依据;bitLen以最短二进制位数描述整数的量级规模,是存储估算、复杂度预估与溢出预判的重要指标。
结合 bigInt_basic_prop.md 中的示例,开发者可以快速上手:通过BigInt.parse或各类构造函数初始化BigInt,再借助sign与bitLen完成对任意精度整数基本性质的查询,为后续的高精度算术、类型转换与加密算法等场景奠定基础。更多相关示例可参考 bigInt_basic_arithmetic.md(基础四则运算)与 bigInt_compare_opration.md(大小比较)。
- 文档
- 知识库
- 教程
- OpenHarmony
【免费下载链接】CangjieCorpus
本仓库为仓颉编程语言语料库,聚焦 仓颉编程语言 核心知识体系,整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源,经结构化处理与专业标注,构建为支持 RAG(检索增强生成)技术 的高质量知识基座,适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用,推动鸿蒙开发生态智能化升级!
相关推荐
仓颉语言 HashSet 实战:add / iterator / remove 用法详解与底层原理
仓颉语言 HashSet 实战:add / iterator / remove 用法详解与底层原理 本文基于仓颉语言语料库(CangjieCorpus)中 Ha
文档知识库教程OpenHarmonyStarRocks array_max 函数详解:语法、示例与底层实现原理
StarRocks array_max 函数详解:语法、示例与底层实现原理 array_max 是 StarRocks 提供的数组高阶函数之一,用于返回 ARR
数据库OLAP数据仓库大数据湖仓一体数据分析StarRocks bitmap_contains 函数详解:语法、示例与底层实现原理
StarRocks bitmap_contains 函数详解:语法、示例与底层实现原理 本文围绕 StarRocks 内置的 bitmap_contains 函
数据库OLAP数据仓库大数据湖仓一体数据分析
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考