ZetCode

FreeBasic UInteger 关键字

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

FreeBasic 的 UInteger 关键字表示无符号整数数据类型。它只能存储正整数,与相同大小的有符号整数相比,它提供了更大的正数范围。

基本定义

在 FreeBasic 中,UInteger 是一个 32 位无符号整数类型。它可以存储从 0 到 4,294,967,295 (2³²-1) 的值。与有符号整数不同,它不能表示负数。

当您需要处理永远不应为负数的值时,例如计数、大小或内存地址,UInteger 就非常有用。它可以防止意外的负值,并提供有符号整数正数范围的两倍。

声明 UInteger 变量

此示例显示了如何声明和初始化 UInteger 变量。

uinteger_declare.bas
Dim population As UInteger
Dim fileSize As UInteger = 1024
Dim maxValue As UInteger = 4294967295

Print "population: "; population
Print "fileSize: "; fileSize
Print "maxValue: "; maxValue

在这里,我们声明了三个 UInteger 变量。第一个未初始化,默认为 0。其他两个分别显式设置为 1024 和最大的 UInteger 值。尝试赋值为负数会导致错误。

UInteger 算术运算

UInteger 支持标准算术运算,并具有一些独特的行为。

uinteger_arithmetic.bas
Dim a As UInteger = 4000000000
Dim b As UInteger = 300000000
Dim result As UInteger

result = a + b
Print "Addition: "; result

result = a - b
Print "Subtraction: "; result

result = a * 2
Print "Multiplication: "; result

result = a \ 2
Print "Division: "; result

这演示了带有大型 UInteger 值的算术运算。加法正常工作,但从较小的数中减去较大的数会导致回绕。乘法显示了 UInteger 如何处理非常大的正数。

循环中的 UInteger

UInteger 非常适合需要大范围的循环计数器。

uinteger_loop.bas
Dim counter As UInteger

For counter = 10 To 0 Step -1
    Print "Countdown: "; counter
    Sleep 500
Next

Print "Blast off!"

此倒计时循环使用 UInteger 计数器。虽然这个特定的示例不需要 UInteger 的完整范围,但它演示了正确的用法。请注意,尽管计数器是无符号的,循环仍然在 0 处正确停止。

带位运算的 UInteger

UInteger 与位运算配合良好,因为它直接表示二进制值。

uinteger_bitwise.bas
Dim flags As UInteger = &b1010
Dim mask As UInteger = &b1100

Print "Original: "; Bin(flags, 32)
Print "AND: "; Bin(flags And mask, 32)
Print "OR: "; Bin(flags Or mask, 32)
Print "XOR: "; Bin(flags Xor mask, 32)
Print "NOT: "; Bin(Not flags, 32)
Print "Shift Left: "; Bin(flags Shl 2, 32)
Print "Shift Right: "; Bin(flags Shr 1, 32)

此示例显示了 UInteger 上的各种位运算。Bin 函数显示二进制表示。UInteger 非常适合位操作,因为它没有符号位的复杂性。

用于内存地址的 UInteger

UInteger 通常用于处理内存地址和指针。

uinteger_memory.bas
Dim buffer(100) As Byte
Dim address As UInteger = Cast(UInteger, @buffer(0))

Print "Buffer address: "; Hex(address)
Print "Buffer size: "; SizeOf(buffer); " bytes"

Dim elementAddress As UInteger = address + 50
Print "Element 50 address: "; Hex(elementAddress)

在这里,我们使用 @ 运算符获取缓冲区的内存地址,并将其转换为 UInteger。然后我们执行指针算术。UInteger 在这方面非常自然,因为内存地址总是正数。

UInteger 溢出行为

理解 UInteger 溢出对于正确的程序行为至关重要。

uinteger_overflow.bas
Dim max As UInteger = 4294967295
Dim min As UInteger = 0

Print "Max value: "; max
max += 1
Print "After overflow: "; max

Print "Min value: "; min
min -= 1
Print "After underflow: "; min

这演示了 UInteger 的回绕行为。增加最大值会回绕到 0,而减小 0 会回绕到最大值。与有符号整数不同,溢出不会导致未定义行为。

UInteger 类型转换

FreeBasic 处理 UInteger 与其他数字类型之间的转换。

uinteger_conversion.bas
Dim ui As UInteger = 4000000000
Dim i As Integer = -1000000000

Print "UInteger to Integer: "; CInt(ui)
Print "Integer to UInteger: "; CUInt(i)

Dim f As Single = 3.14159
Print "Single to UInteger: "; CUInt(f)
Print "UInteger to Single: "; CSng(ui)

这显示了 UInteger 与其他类型之间的显式类型转换。将大的 UInteger 转换为 Integer 可能会产生意外的负数。将负数转换为 UInteger 会将其回绕为较大的正数值。

最佳实践

本教程通过实际示例涵盖了 FreeBasic 的 UInteger 关键字,展示了其在不同场景下的用法。

作者

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

列出所有 FreeBasic 教程