Skip to content

数据类型

twinBASIC支持十四种内置数据类型。它们分为四大类别:数值型(整数和浮点)、文本、日期/时间和引用/泛型。本页是存储大小、取值范围和类型声明后缀的权威参考。

关于twinBASIC对此集合的新增类型 --- LongLongLongPtr和作为独立类型的Decimal --- 参见功能 → 新数据类型


快速参考

类型后缀存储范围
Boolean(无)2字节TrueFalse
Byte(无)1字节0到255
Integer%2字节-32,768到32,767
Long&4字节-2,147,483,648到2,147,483,647
LongLong^8字节-9,223,372,036,854,775,808到9,223,372,036,854,775,807
LongPtr(无)4字节(32位)/8字节(64位)取决于目标,与LongLongLong相同
Single!4字节±1.401298E-45到±3.402823E38
Double#8字节±4.94065645841246E-324到±1.79769313486232E308
Currency@8字节-922,337,203,685,477.5808到922,337,203,685,477.5807
Decimal(无)16字节±79,228,162,514,264,337,593,543,950,335(最多28位小数)
Date(无)8字节100年1月1日到9999年12月31日
String$可变最多约20亿个字符
Variant(无)16字节(+ 堆数据)以上任意类型
Object(无)4字节(32位)/8字节(64位)COM接口引用

后缀列出了可选择性附加在字面量或标识符后以强制其类型的字符 --- 例如,42&Long字面量,3.14#DoubleTotal!在类型隐式上下文中声明Single变量。


整数类型

Boolean存储True(-1)或False(0)。当期望Boolean时,运行时将任何非零值视为True;只有-1是规范的True。将任何非零整数赋值给Boolean会将其规范化为-1。

Byte是唯一的无符号整数类型。它保存0--255的值,使其成为二进制I/O和缓冲区操作中使用的字节数组的天然元素类型。

Integer保存小范围有符号整数。在大多数代码中,Long是更好的选择:它在32位硬件上并不更慢,且在值超过32,767时绝不会溢出。Integer在与声明16位字段的结构或API交互时有用。

Long是最常用的整数类型。它覆盖了Win32 DWORDint值的完整范围,是索引变量和计数器的默认类型。

LongLong是在32位和64位构建中都可用8字节有符号整数。在VBA中它仅限于64位目标;twinBASIC解除了此限制,允许在32位项目中使用LongLong。当值可能超过2,147,483,647时使用它 --- 文件大小、滴答计数、GUID和64位Win32句柄。后缀^标记LongLong字面量:9_000_000_000^

LongPtr根据编译目标改变宽度:32位构建4字节,64位构建8字节。它是Win32句柄、窗口句柄(HWND)和必须在两种模式下工作的Declare语句中指针的正确类型。它没有字面量后缀 --- 使用Dim x As LongPtr声明变量并赋值数值表达式。

整数溢出默认引发运行时错误(错误6)。溢出不会静默回绕。


浮点类型

SingleDouble分别遵循IEEE 754单精度和双精度浮点标准。两者都可以将NaNInfinity表示为位模式,但VBA运行时在大多数会产生它们的操作上引发错误。

Double是包含小数点的无类型数字字面量的默认类型(3.14Double)。精度约为15--16位有效十进制数字。选择它用于通用浮点运算。

Single精度约为6--7位有效十进制数字。它更小,在紧凑循环中可能更快,但精度降低使其不适合舍入误差敏感的金融或科学计算。

Currency是定点类型,内部存储为按10,000缩放的64位有符号整数。它避免了IEEE 754类型的二进制舍入误差,恰好携带四位小数。用于货币值和任何需要精确十进制舍入的计算。


Decimal

Decimal是16字节类型,使用12字节(96位)整数加上可变小数点位置和符号位。它提供最多29位有效数字和最多28位小数,是可用精度最高的数值类型。

INFO

在twinBASIC中,Decimal既可作为Variant子类型使用(如VBA中),也可作为独立声明类型使用 --- Dim x As Decimal可编译运行。转换函数CDec返回Decimal值。


Date

Date存储为IEEE 754双精度浮点数:整数部分计算从纪元(1899年12月30日)开始的天数,小数部分表示一天中的时间(午夜为0.0,正午为0.5)。可表示范围为100年1月1日到9999年12月31日。

DateTime属性返回当前日期和时间。Now返回两者组合。由于Date本质上是DoubleDate值上的算术运算有效:加1前进一天,两个日期相减得到它们之间的天数。


String

String保存Unicode字符序列,内部存储为COM BSTR(长度前缀宽字符字符串)。长度以字符为单位测量,而非字节;每个字符2字节宽(UTF-16 LE)。String最多可保存约20亿个字符,实际受可用内存限制。

String变量初始化为vbNullString(空BSTR指针),这与零长度字符串("")不同。大多数字符串操作将两者视为空字符串,但在传递字符串给区分空指针和空缓冲区的API时,这个区别很重要。参见StrPtr获取底层缓冲区的地址。

定长字符串 --- Dim s As String * 20 --- 恰好占用指定数量的字符,赋值时右侧补空格或截断。适用于固定宽度的二进制文件记录。


Variant

Variant是标记联合,可以保存上表中的任何类型,加上NullEmpty和数组。其16字节头部存储类型标签(VbVarType),后跟类型特定数据。当值为StringObject或数组时,8字节数据槽保存指向堆分配存储的指针。

Empty是未初始化Variant的默认状态 --- 它与0""FalseNull不同。使用IsEmpty检测。Null会在算术和比较中传播;使用IsNull检测。

Variant是后期绑定COM调用中参数和返回值的必需类型,也是运行时返回类型变化的任何函数的必需类型。与有类型变量相比,每次操作都有少量开销,因为运行时必须检查标签。在设计时类型已知的情况下,优先使用有类型变量。


Object

Object保存COM接口引用 --- 指向vtable的指针。在32位构建中占用4字节;64位构建中8字节。运行时在赋值时调用AddRef,在变量超出作用域或设置为Nothing时调用Release

Nothing是零值的Object引用。使用If obj Is Nothing Then检测。

Object变量可以保存任何兼容COM的对象;运行时通过IDispatch(后期绑定)解析成员调用。使用特定类或接口类型声明变量 --- Dim fs As FileSystemObject --- 可启用早期绑定,速度更快并产生编译时类型检查。


另见

twinBASIC及其LOGO版权为作者"韦恩"所有