ZetCode

FreeBasic ULong 关键字

最后修改日期:2025 年 6 月 16 日

FreeBasic 的 ULong 关键字表示一个无符号 32 位整数数据类型。它可以存储从 0 到 4,294,967,295 (2^32 - 1) 的值。ULong 在处理大正数时非常有用。

基本定义

在 FreeBasic 中,ULong 是一个内置的无符号整数类型,占用 4 字节(32 位)内存。与有符号类型不同,它不能表示负数,但具有更大的正数范围。

ULong 变量通常用于计数、数组索引和位操作。在处理大正数值时,它们可以防止溢出。ULong 的类型后缀是 ULul

声明 ULong 变量

此示例展示了如何声明和初始化 ULong 变量。

ulong_declare.bas
Dim population As ULong
Dim fileSize As ULong = 4294967295UL
Dim counter As ULong = 1000000UL

Print "population: "; population
Print "fileSize: "; fileSize
Print "counter: "; counter

在这里,我们声明了三个 ULong 变量。第一个未初始化,默认为 0。其他变量被显式设置为值。请注意用于指示 ULong 字面量的 UL 后缀。这有助于防止赋值期间的溢出。

ULong 算术运算

ULong 变量支持标准算术运算,但有一些限制。

ulong_arithmetic.bas
Dim a As ULong = 4000000000UL
Dim b As ULong = 300000000UL

Print "Addition: "; a + b
Print "Subtraction: "; a - b
Print "Multiplication: "; a * 2UL
Print "Division: "; a / 2UL
Print "Modulus: "; a Mod b

此示例演示了 ULong 值的基本算术运算。所有运算都必须保持在 0 到 4,294,967,295 的范围内。由于无符号性质,尝试低于零的值会环绕到最大值。

循环中的 ULong

ULong 对于具有大量迭代计数的循环非常有用。

ulong_loop.bas
Dim i As ULong
For i = 4294967290UL To 4294967295UL
    Print "Count: "; i
    Sleep 200
Next

此循环一直计数到 ULong 的最大值。使用 ULong 可以防止在有符号类型处理高值时发生的溢出。Sleep 暂停使得在计数时输出更易于阅读。

带位运算的 ULong

由于其固定大小,ULong 非常适合位操作。

ulong_bitwise.bas
Dim flags As ULong = &B11001100110011001100110011001100UL

Print "Original: "; Bin(flags, 32)
Print "AND: "; Bin(flags And &HFFFFFFFFUL, 32)
Print "OR: "; Bin(flags Or &H0000000FUL, 32)
Print "XOR: "; Bin(flags Xor &HAAAAAAAAUL, 32)
Print "NOT: "; Bin(Not flags, 32)
Print "Shift Left: "; Bin(flags Shl 4, 32)
Print "Shift Right: "; Bin(flags Shr 4, 32)

这展示了对 ULong 值进行的位运算。Bin 函数以二进制格式显示结果。ULong 的固定 32 位大小使其在位操作方面具有可预测性,不像可变大小的类型。

ULong 数组示例

ULong 数组可以高效地存储大量无符号数据。

ulong_array.bas
Dim primes(0 To 4) As ULong = {2UL, 4294967291UL, 4294967293UL, _
                               4294967295UL, 7UL}

For i As ULong = 0 To 4
    Print "Prime "; i; ": "; primes(i)
Next

这创建了一个 ULong 值数组,包括一些接近 ULong 最大值的非常大的素数。数组索引使用了 ULong 以保持一致性,尽管使用 Integer 作为索引也可以。

ULong 函数参数

函数可以接受和返回 ULong 值以进行大数运算。

ulong_function.bas
Function Factorial(n As ULong) As ULong
    If n <= 1 Then Return 1UL
    Return n * Factorial(n - 1UL)
End Function

Dim num As ULong = 12UL
Print num; "! = "; Factorial(num)

这个递归阶乘函数使用 ULong 来处理比有符号类型更大的结果。请注意,阶乘增长非常快——即使是 ULong 也会在 13! 时溢出(13 的阶乘超过了 ULong 的最大值)。

ULong 类型转换

FreeBasic 处理 ULong 与其他数值类型之间的转换。

ulong_conversion.bas
Dim ul As ULong = 4000000000UL
Dim i As Integer = -1

Print "ULong to Integer: "; CInt(ul)
Print "Integer to ULong: "; CULng(i)
Print "ULong to Single: "; CSng(ul)
Print "Single to ULong: "; CULng(12345.678)

这演示了 ULong 的显式类型转换。将大的 ULong 转换为有符号类型可能会因溢出而产生意外结果。负数转换为 ULong 时会变成大的正数值。

最佳实践

本教程通过实际示例介绍了 FreeBasic 的 ULong 关键字,展示了它在不同场景下的用法。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 FreeBasic 教程