跳轉到內容

Futurebasic/語言/資料型別

來自華夏公益教科書,開放書籍,構建開放世界

資料型別和資料表示

[編輯 | 編輯原始碼]

修訂:2000年5月30日(版本3)

整數可以表示為字面量,符號常量或變數。

整數字面量

[編輯 | 編輯原始碼]
  • 十進位制: 一串十進位制數字,可選地以 "+" 或 "-" 開頭。
    例子
     7244      -328442
  • 十六進位制: 一串最多 8 位十六進位制數字,以 "&" 或 "&H" 或 "0x" (即零-x) 開頭。十六進位制數字包括數字 0 到 9,以及字母 AF。字母可以是大寫或小寫。
    例子
     &H12a7      0x47BeeF      &42AD9
    
  • 八進位制: 一串最多 10 位八進位制數字,以 "&O" (即字母 "O",而不是零) 開頭。八進位制數字包括數字 0 到 7。
    例子
     &o70651      &o32277
    
  • 二進位制: 一串最多 32 位二進位制數字,以 "&x" 開頭。二進位制數字包括數字 0 和 1。
    例子
     &x0100011      &x10110000111011001
    
  • 引號: 一串最多 4 個字元,用雙引號括起來,並在初始引號之前有一個下劃線。引號字串中的每個字元根據字元的 ASCII 碼在生成整數的內部位模式中表示 8 位。
    例子
     _"TEXT"      _"N*"
    

注意:十六進位制、八進位制、二進位制和引號字面量反映了整數在記憶體中儲存的實際位模式。這些可以解釋為正數或負數,具體取決於它們被分配給哪種型別的變數。如果它們沒有被分配給任何變數,它們通常被解釋為正數。

符號常量

[編輯 | 編輯原始碼]

符號常量是一個由下劃線字元開頭的識別符號。FB 中有許多符號常量具有預定義的值。您也可以在程式中定義自己的符號常量,可以使用 BEGIN ENUM...END ENUM 塊;或 DIM RECORD...END RECORD 塊;或使用 "常量宣告" 語句。常量宣告語句具有以下語法

_constantName = staticExpression

其中 _constantName 是一個以前未定義的符號常量,staticExpression 是一個 "靜態整型表示式" (參見 附錄 D: 數字表達式)。staticExpression 的值必須在 -2,147,483,648 到 +2,147,483,647 之間。符號常量一旦被分配了一個值,該值在程式中就不能被更改。與所有常量一樣,符號常量具有全域性作用域。

常量宣告還可以包含使用以下格式之一的 Pascal 風格字串

_constantName$    = "I am a string constant" 
_constantTab$     = 9      : REM CHR$(9) = tab character 
_constantCR$      = 13     : REM CHR$(13) = carriage return 
_twoByteKanjiChar = 10231  : REM KCHR$(10231)

整型變數

[編輯 | 編輯原始碼]

FB 中有六種不同的整型變數;它們在所佔儲存空間和可以表示的值範圍方面有所不同。整型變數的名稱可能以型別標識字尾結尾,該字尾指示其型別;或者,您可以使用 DIM 語句中的 AS 子句宣告整型變數的型別。如果變數沒有型別標識字尾,並且沒有使用 AS 子句宣告,則 FB 會檢查是否有任何 DEF<type> 語句適用於該變數。最後,如果變數不能透過以上任何方式進行型別化,則 FB 會將型別 "帶符號短整型" 分配給該變數。整型陣列和整型記錄欄位透過類似的方式進行型別化。

型別 儲存 範圍 型別識別
無符號位元組 1 位元組 0..255
x``
DIM x AS Unsigned Byte
DIM x AS Unsigned Char
帶符號短整型 2 位元組 -32768..+32767
x%
DIM x AS Int
DIM x AS Word
DIM x AS Short
無符號短整型 2 位元組 0..65535
x%`
DIM x AS Unsigned Int
DIM x AS Unsigned Word
DIM x AS Unsigned Short
帶符號長整型 4 位元組 -2147483648..+2147483647
x&
DIM x AS Long
無符號長整型 4 位元組 0..4294967295
x&`
DIM x AS Unsigned Long

"實數" 是可能具有小數部分的數字。它們可以表示為字面量或變數。

實數字面量

[編輯 | 編輯原始碼]
  • 標準記數法: 一串十進位制數字,包括一個小數點;可選地以 "+" 或 "-" 開頭。
    例子
     17.3      -62.       0.03
    
  • 科學記數法: 一串字元,格式如下:mantissa{E|e}exponent
    mantissa 是一串十進位制數字,可能包含一個小數點,可選地以 "+" 或 "-" 開頭;exponent 是一串十進位制數字,可選地以 "+" 或 "-" 開頭。例子:
     3e-20      -6.7E4      0.05E+14
    

    用科學記數法表示的數字的值為:mantissa 10exponent

實型變數

[編輯 | 編輯原始碼]

FB 中有三種類型的實型變數;它們在所佔儲存空間、可以表示的值範圍及其精度 (有效數字位數) 方面有所不同。

定點實數
[編輯 | 編輯原始碼]

定點實型變數必須在 DIM 語句中宣告,使用 AS FIXED 子句。它的精度約為小數點後 5 位,可以處理大約 -32767.99998 到 +32767.99998 之間的數字。定點變數佔用 4 位元組的儲存空間。

浮點實數
[編輯 | 編輯原始碼]

FB 支援兩種浮點實型變數。浮點變數的名稱可能以型別標識字尾結尾,該字尾指示其型別;或者,您可以使用 dim 語句中的 as 子句宣告浮點變數的型別。如果變數沒有型別標識字尾,並且沒有使用 as 子句宣告,則 FB 會檢查是否有任何 defsng <letterRange>defdbl <letterRange> 語句適用於該變數。浮點陣列和浮點記錄欄位透過類似的方式進行型別化。

您可以修改 FB 在處理這些變數之一時使用的方法。一組常量儲存在 headers 資料夾中的一個檔案中。(路徑:FB Extensions/Compiler/Headers/UserFloatPrefs)。如果您想更改所有專案的這些引數,請將名為“UserFloatPrefs”的檔案複製到User Libraries資料夾。User Libraries資料夾位於與編輯器相同的級別。

//
// Required Floating Point Constants //
//
_NumberLeadingSpace = _True //FB II Default = _true <br>
_RoundUpFloat2Long = _true // Un-remark to round up Float to Integer

雙精度浮點數變數佔用更多儲存空間,代表更大的值範圍,並且比單精度浮點數變數具有更高的精度。

型別型別標識

單精度

x! (4 位元組)
dim as single x

雙精度

x# (8 位元組
dim as double x

字串

[edit | edit source]

字串是最多 255 個字元的列表,通常被解釋為 MacPascal 編碼中的文字。字串可以表示為文字或變數。

字串文字

[edit | edit source]

字串文字是由一對雙引號包圍的一組字元(注意:在某些上下文中,例如在data語句中,引號是可選的)。如果字串文字包含一對連續的雙引號,則它們被解釋為一個(單個)嵌入的雙引號,並被視為字串的一部分,而不是分隔符。示例

print "I said, ""Hello."""

輸出

I said, "Hello."

字串變數

[edit | edit source]

dim語句以以下方式指定字串變數及其大小

dim as Str255 s  // s is a 255 character string
dim as Str63  s  // s is a 63 character string
dim as Str31 s  // s is a 31 character string
dim as Str15 s  // s is a 15 character string

dim s as Str255  // s is a 255 character string
dim s$           // s is a 255 character string
dim 3 s$         // s is a 3 character string [the custom size value can range from 1 to 255]

dim as Str31 s$  // s is a 255 character string [this anomaly, present in the old FB Compiler, may be removed from FBtoC]

如果變數沒有型別標識字尾,並且沒有用as子句宣告,那麼 FB 會檢查是否有任何適用於該變數的defstr <letterRange>語句。

字串陣列和字串記錄欄位的型別與字串變數類似。

在內部,字串以 Pascal 格式儲存,以一個長度位元組開頭,該位元組指示當前字串中的字元數(0 到 255)。長度位元組緊隨其後的是字串的字元,每個字元一個位元組。FutureBASIC 始終為記憶體中的字串變數分配偶數個位元組;這足以包含長度位元組,加上變數的最大字串長度的足夠字元位元組,再加上一個額外的“填充”位元組(如果需要)以使總量達到偶數。使用sizeof()來確定分配給特定字串變數的位元組數。

容器

[edit | edit source]

容器是編譯器管理的控制代碼,可以儲存高達 2 GB 的 ASCII 或數字資訊。容器可以用雙美元符號(dim myContainer$$)或在dim as語句中(dim as container myContainer)標識。在 FBtoC 中,容器僅儲存 ASCII 資訊,不允許數字賦值和操作。

容器始終是全域性的。嘗試在區域性函式內定義容器將在編譯期間導致錯誤訊息。當容器首次被定義時,它是一個值為零的長整型變數。一旦資料被放入容器中,就會分配一個控制代碼,並將資料移動到該控制代碼。要釋放分配的控制代碼,請使用myContainer$$ = ""將容器設定為空字串。

由於容器可以儲存 ASCII 或數字資訊,因此存在一些權衡取捨。首先是速度。儲存在容器中的數值首先被轉換為 ASCII。當需要數學運算時,資料在計算之前會重新轉換。(在 FBtoC 中,容器僅儲存 ASCII 資訊,不允許數字賦值和操作。)

另一個限制與容器的填充方式有關。由於 FB 不知道容器中可能包含什麼資料,因此它必須評估等號另一側的資訊以檢視應該做什麼。如果該資料是一系列 Pascal 字串,那麼容器必須限制為 255 個字元。

myContainer$$ = a$ + b$ + c$

如果資訊是要連線的字串,而等號右側只包含 Pascal 風格的字串,那麼您必須從不同的方向進行操作。

myContainer$$ = a$
myContainer$$+= b$
myContainer$$+= c$

在某些情況下,編譯器將無法確定您想到的操作型別。例如...

a$$ = b$$ + c$$

編譯器不知道它應該連線字串還是新增數字。您可以透過插入一個額外的運算子來強制執行正確操作。

a$$ = b$$ + c$$ + 0  : REM math
a$$ = b$$ + c$$ + "" : REM strings

對於減號或乘法(星號)符號等其他數學運算子來說,這不是問題,因為它們與字串無關。

容器不能以傳統意義上的方式進行比較。這是因為比較本質上必須返回一個數值。如果您執行類似PRINT a$ = b$的語句,結果將是零(_false)或 -1(_zTrue)。我們提供了一個替代函式,可以幫助您處理比較。

rslt& = fn FBcompareContainers(a$$,b$$)

如果a$$小於b$$,那麼結果將為負數,並且將表示找到差異的字元位置。如果rslt&為 -3000,那麼a$$b$$在最初的 2999 個字元中是相同的,此時發現b$$中的下一個字元小於a$$中的字元。

rslt&為零時,容器相等。

rslt&為正數時,它指向確定a$$大於b$$的字元位置。

容器作為可重定位塊儲存在應用程式堆中。您可以按如下方式提取這些塊的控制代碼

hndl& = [@myContainer$$]

請注意,如果容器已被清除或從未初始化,則控制代碼可能為零。

與用於填充編輯欄位的語法類似的語法可用於將資訊傳遞給容器。百分號 (%) 表示容器將用_"TEXT"資源的內容填充。與號 (&) 表示 FB 將用來自控制代碼的資訊填充容器。

a$$ = %resID //  fill container with TEXT res ID resID
a$$ = & myHandle; // fill container with contents of myHandle

注意
您不能在等號右側使用包含容器和/或 Pascal 字串的複雜表示式。不要使用

c$$ = c$$ + left$$(a$$,10)
d$$ = c$$ + a$

使用

c$$ += left$$(a$$,10)
d$$ = c$$
d$$ += a$

指標

[edit | edit source]

指標變數始終在dim語句中宣告。它可以使用as pointer(或as ptr)子句,或as ptrType子句來宣告,其中ptrType是在先前#define語句中標識為pointer型別的型別。如果as pointer 子句包含to子句,那麼該變數被標識為“指向”所指示型別的資料結構;否則它被視為“通用”指標。

指標的值實際上是一個長整型;它是資料結構的地址。在某些情況下,指標的值可能為_nil(零),這表示指標當前沒有“指向”任何內容。

如果您將指標變數宣告為指向特定記錄型別,則可以使用指標變數來引用記錄中的特定欄位(有關更多資訊,請參見附錄 B:變數)。這是使用指標變數而不是長整型變數來儲存資料結構地址的主要優點。

控制代碼

[edit | edit source]

控制代碼變數始終在DIM語句中宣告。它可以使用AS HANDLE(或AS HNDL)子句,或AS hdlType子句來宣告,其中hdlType是在先前#DEFINE語句中標識為HANDLE型別的型別。如果AS HANDLE子句包含TO子句,那麼該變數被標識為指向所指示型別的資料結構的控制代碼;還有一些預定義型別(RGNHANDLETEHANDLE)被識別為指向特定型別的 MacOS 結構(具體來說:指向區域和 TextEdit 記錄)。如果變數僅宣告為“AS HANDLE”(沒有TO子句),則它被視為“通用”控制代碼。

控制代碼的值實際上是一個長整型;它是指向包含資料結構的可重定位塊的“主指標”的地址。在某些情況下,控制代碼的值可能為_nil(零),這表示它當前不引用任何資料結構。您可以使用長整型變數來儲存與控制代碼變數相同的地址,並且在許多情況下,控制代碼變數和長整型變數是可互換的。

如果您將控制代碼變數宣告為引用特定記錄型別,則可以使用控制代碼變數來引用記錄中的特定欄位(有關更多資訊,請參見附錄 B:變數)。這是使用控制代碼變數而不是長整型變數來儲存控制代碼值的主要優點。

記錄

[edit | edit source]

記錄是儲存在記憶體中的資料項集合。您可以將整個記錄作為一個單元訪問,也可以單獨訪問其資料元素。與所有元素型別相同的陣列不同,記錄的元素(也稱為“欄位”)可以是不同型別的。

記錄變數必須在dim語句中宣告

dim varName as RecordType
dim as RecordType  varName

其中 RecordType 是預定義的記錄型別。您可以使用begin record ... end record 塊來定義記錄型別及其欄位。此外,FB 識別兩種內建記錄型別:RectPoint。您可以使用varName.field 語法訪問記錄變數的欄位(參見 附錄 B:變數)。

型別的相容性

[編輯 | 編輯原始碼]

您可以將一種型別的數值分配給另一種型別的變數,有時會有一些限制。下表顯示了哪些型別的數值可以分配給哪些型別的變數。

數值
變數
有符號。
位元組
無符號。
位元組
有符號。
無符號。
有符號。
長整型
無符號。
長整型
定點型 簡單型 雙精度型 字串 指標 控制代碼 記錄
有符號。位元組 可以 2 2 2 2 2 2,3 2,3 2,3 2,3,8 不可 不可 不可
無符號。位元組 1 可以 1,2 2 1,2 2 1,2,3 1,2,3 1,2,3 1,2,3,8 不可 不可 不可
有符號。字 可以 可以 可以 2 2 2 3 2,3 2,3 2,3,8 不可 不可 不可
無符號。字 1 可以 1 不可 1,2 2 1,3 1,2,3 1,2,3 1,2,3,8 不可 不可 不可
有符號。長整型 可以 可以 可以 可以 可以 2 3 2,3 2,3 2,3,8 10 10 不可
無符號。長整型 1 可以 1 可以 1,2 可以 1,3 1,2,3 1,2,3 1,2,3,8 10 10 不可
定點型 可以 可以 可以 2 2 2 可以 2,4 2,4 2,4,8 不可 不可 不可
簡單型 可以 可以 可以 可以 4 4 4 可以 4 4,8 不可 不可 不可
雙精度型 可以 可以 可以 可以 可以 可以 可以 可以 可以 8 不可 不可 不可
字串 5,8 5,8 5,8 5,8 5,8 5,8 5,8 5,8 5,8 5 5,8 5,8 不可
指標 可以 可以 可以 可以 可以 可以 2,3 2,3 2,3 2,3,8 6 不可 不可
控制代碼 可以 可以 可以 可以 可以 可以 2,3 2,3 2,3 2,3,8 可以 7 不可
記錄 不可 不可 不可 不可 不可 不可 不可 不可 不可 不可 不可 不可 9
  1. 將負值分配給無符號整型可能會產生意外結果。
  2. 將超出類型範圍的數值分配給變數可能會產生意外結果。
  3. 結果將四捨五入到最接近的整數。
  4. 可能會丟失一些精度位。
  5. 確保目標字串變數聲明瞭足夠的儲存空間。
  6. 兩者必須是指向相同型別(或兩者都是“通用”指標)的指標。
  7. 兩者必須是指向相同型別(或兩者都是“通用”控制代碼)的控制代碼。
  8. 自動字串/數字轉換需要特殊的首選項設定;否則,使用VAL[&]STR$ 函式。
  9. 兩者必須是相同的記錄型別(如果是“真實”記錄)或具有相同的長度(如果是“偽”記錄)。
  10. 控制代碼或指標引用的事物型別的相關資訊在控制代碼或指標值被分配給長整型變數時會丟失。(這在某些情況下可能有用,如果您想“強制”指標指向不同的型別。)
華夏公益教科書