新觀念的 VB6 教本 第 6 章 資料型別
6-1 "1"+"1"≠"2"
資料型別的觀念 -- 比較它們的差異 1+1 等於 2 "1"+"1" 等於 11 資料型別的觀念 -- 比較它們的差異 1+1 等於 2 "1"+"1" 等於 11 Print #10/5/97# > #8/5/97# 得到 True Print "10/5/97" > "8/5/97" 得到 False Print 4.0/3 印出 1.33333333333333 Print 4/3 印出 1.333333 (VB 5.0版) Print 4/3 印出 1.33333333333333 (VB 6.0版)
6-2 VB的資料型別
VB的資料型別 資料類別 資料型別 型別的英文名稱 字串 String 日期時間 Date 布林 Boolean 數值 整數 長整數 倍精準度 單精準度 Integer Long Double Single
檢驗資料的型別
檢驗資料的型別 ? TypeName(#11/25/97#) ' 日期 Date ' 日期時間型別 ? TypeName(True) ' 布林資料 Boolean ' 布林型別
檢驗數值資料的型別 ? TypeName(1.5) 小數 Double 倍精準度型別 ? TypeName(4.9E+12) 浮點數 Double 倍精準度型別 ? TypeName(100) 整數 Integer 整數型別 ? TypeName(100000) 整數 Long 長整數型別 ? TypeName(123456789012) 整數 Double 倍精準度型別
6-3 數值資料型別
整數型別 所佔用的空間是2 bytes,也就是16個位元(bit)。 共可表示 216=65536個整數值,又因為其 中一半的數要用來表示負數,所以整數 的範圍在 -32768~32767之間。 例如: 20480 ' 數值介於 -32768~32767 之間,所以會存成整數型別
長整數型別 所佔用的空間是4 bytes等於32個位元(bit)。 可表示的整數個數有232=216×216=65536×65536, 是整數型別的65536倍。 其數值範圍介於 -2147483648~2147483647之 間,約9~10位數。如果數值超過整數型別的 容量,但可以放得進4 bytes裡面,則會被存成 長整數型別,例如: 2500 ' 在整數範圍之內, 所以存成整數型別 56000 ' 超過整數範圍,但是在長整數範圍之 內,所以存成長整數型別
精準度型別 型 別 所佔 空間 有效位數 指數值 範圍 可表示的數值範圍 倍精準度 8 bytes 15 位 -324~308 型 別 所佔 空間 有效位數 指數值 範圍 可表示的數值範圍 倍精準度 8 bytes 15 位 -324~308 負數:-1.79E+308~ -4.94E-324 正數: 4.94E-324~ 1.79E+308 單精準度 4 bytes 7 位 -45~38 負數:-3.4E+38~ -1.4E-45 正數: 1.4E-45~ 3.4E+38
資料被存成倍精準度型別的情況一 如果一個數值被表示成小數或浮點數,VB都會將它存成倍精準度型別。 例如: 56.396 小數表示法,存成倍精準度型別 1.8765E+65 浮點數表示法,存成倍精準度型別 1000.0 雖然等於整數 1000,但卻是小數 表示法,依然存成倍精準度型別
資料被存成倍精準度型別的情況二 如果是整數表示法,而其數值超過長整數範圍,該整數也會存成倍精準度型別,例如: 9876543210987 ‘ 超過長整數範圍,存成倍精準度型別
資料被存成倍精準度型別的情況二(2) 倍精準度型別的有效位數為15位,如果數值表示法中的位數超過15位,VB將會對多餘的位數採四捨五入法,例如: Print 1.23456789012345678 1.23456789012346 Print 987654321098765432 9.87654321098765E+17
資料被存成倍精準度型別的情況二(3) 單精準度型別的有效位數有7位,但是當我們表示一個位數低於7位的實數時,VB還是不會將該數值存成單精準度型別,例如: 1.335 會被存成倍精準度型別,是因為 VB 內部作法的關係,不是因為 1.335 無法存成單精準度型別。
資料被存成倍精準度型別的情況二(4) 我們可以主動要求 VB 將資料存成單精準度型別,方法是在數值後面加上 ‘!’,例如: 1.335! 用 ! 符號,要求 VB 將 1.335 存成單精準度型別
資料被存成倍精準度型別的情況二(VB5 vs. VB6) 當兩整數相除時,對VB5來說,其結果也是存成單精準度型別,例如:(不過對VB6來說,卻是存成倍精準度型別) Print 4/3 兩整數相除 VB5 1.333333 Print 4/3 兩整數相除 VB6 1.33333333333333 Print 4.0/3 這是倍精準數除以整數 1.33333333333333
6-4 型別宣告符號
VB 如何決定資料的型別 如果是整數的表示法,依序判斷以下數值範圍: 數值介於 -32768~32767 之間,存成整數型別。 數值介於 -2147483648~2147483647 之間,存成 長整數型別。 數值超過長整數範圍,存成倍精準度型別。 如果不是整數表示法,一律存成倍精準度型別。
利用 TypeName 來檢驗 Print TypeName(1024) Integer Print TypeName(56000) Long Print TypeName(10.98 ) Double
告訴VB我們希望儲存的 資料型別 Print TypeName(1.335!) Single ' VB 果然將資料存成單精準度型別了
數值型別的型別宣告符號 型別宣告符號 宣告之型別 % 整數 & 長整數 ! 單精準度 # 倍精準度
數值型別的型別宣告符號 -- 例子 1536& ' 雖然 1536 只要存成整數型別即 可,但我們 利用 & 符號將它宣 告成長整數型別 48000# ' 雖然 48000 只要存成長整數型別 即可,但我們利用 # 符號將它宣 告成倍精準度型別 123% ' 123 原本就會存成整數型別,再 加上 % 的 整數型別宣告符號,有 點多餘,卻是正確的
型別宣告的注意事項 非整數的表示法,不能宣告成整數或長整數型別。 不能將資料宣告成不足以容納該資料的型別。 位數多的數值宣告成有效位數少的型別時,數值會被四捨五入。
型別宣告的注意事項 -- 例子 Print 100.0% 錯誤, 雖然 100.0 等於 100, 但這不是整數表示法, 不能宣告成整數型別。 Print 48000% 錯誤,將超過整數範圍的 48000 宣告成整數。 Print 2.34567896! 2.345679 位數9位的數值宣告成有效位7位的單精準度型別,多餘的兩位(96)會被四捨五入。
6-5 變數與資料型別
用 TypeName 來檢驗變數的型別 (1) A = 100 ? TypeName(A) Integer 將整數型別的 100 指定給變數 A 檢查變數 A 的型別 此時變數 A 是整數型別 A = "VB" ? TypeName(A) String 重新指定字串型別的 "VB" 給變數 A 變數 A 的型別也變成了字串型別
用 TypeName 來檢驗變數的型別 (2) L& = 65500 ? TypeName(L&) Long
不定型變數與定型變數 (1) 不定型(Variant)變數 :變數未加型別宣告符號,其型別會隨著資料的內容來改變。 定型變數:變數加了型別宣告符號,其型別固定, 不會隨著指定給它的資料來改變。 每一個定型變數都屬於某一特定型別,例如 L& 是長整數型別(因為最後有 & 符號),在指定資料 時,它只接受可以轉成這個型別的資料。 不定型變數的型別將隨著指定給它的資料來變, 定型變數的型別則是永遠不變。
不定型變數與定型變數 (2) L& = 34896 ' 34896 同樣是長整數型別,自然可接受 L& = 100 ' 100 是整數型別,也可接受 L& = “VB” ' 錯誤!字串 “VB” 無法轉換成長整數 L& = “82500” ' 雖然 “82500” 是字串,但可以轉成 ? TypeName(L&) ' 長整數,所以可接受 Long ' 證明 L 還是長整數 L& = 9.8 ' 將 9.8 轉換成整數,只好四捨五入 Print L& 10 L& = 7.85E+12 ' 錯誤, 7.85E+12 超過長整數的數值範圍
不定型變數與定型變數 (3) A = 34896 ' 此時變數 A 是「長整數」型別 A = 100 ' 變數 A 變成了「整數」型別 A = “VB” ' 變數 A 又變成「字串」型別 A = “82500” ' 變數 A 還是「字串」型別 ? TypeName(A) String ' 證明變數 A 還是字串 A = 9.8 ' 變數 A 變成「倍精準度」型別 Print A 9.8 ' 沒有類似變數 L 四捨五入的情形 A = 7.85E+12 ' 變數 A 還是倍精準度型別, 沒有類似變數 L 產生錯誤的情形
6-6 變數與常數符號的宣告
Dim 敘述(1) 格式: 使用例一: 使用例二: Dim 變數名稱 As 英文型別名稱 Dim A 省略了 "As 英文型別名稱", 則變數A 將是一個不定型變數
Dim 敘述 – 注意事項 Dim 敘述不能在即時運算視窗裡面使用,只能在程式視窗裡面使用。
Dim 敘述(2) 格式: Dim 變數名稱+型別宣告符號 Dim A% ' 將變數 A 宣告成整數型別 Dim S$ ' 將變數 S 宣告成字串型別 Dim V ' 未加型別宣告符號,表示不定型變數
固定長度字串 格式: 例子: Dim 字串變數名 As String * 字串長度
固定長度字串 – 實例(1) Private Sub Command1_Click() Dim S1 As String ' S1 是變動長度字串 Dim S2 As String * 80 ' S2 是固定長度字串 S1 = "abcde" S2 = "12345" ' 利用 Len 計算字串的長度 Print "S1 長度 ="; Len(S1), "S2 長度 ="; Len(S2) S1 = "abcdefghij" S2 = "1234567890" Print "S1 長度 ="; Len(S1), "S2 長度 ="; Len(S2) End Sub
固定長度字串 – 實例(2) 上一頁程式輸出結果: S1 長度 = 5 S2 長度 = 80 S1 長度 = 10 S2 長度 = 80 可見固定長度字串的長度是固定的,不會隨著字串的內容而改變其長度。 變動長度字串則會隨著字串的內容而改變其長度。
型別宣告的限制(1) 一個變數一旦宣告成某種型別以後,就不能在後面的敘述中又重新宣告它的型別,例如: L& = 100 ' 已經將變數 L 宣告成長整數型別 L% = 100 ' 錯誤!企圖將變數 L 重新宣告為整數型別
型別宣告的限制(2) 即使是一個不定型變數,當我們第一次使用它時,它的型別就已經被宣告成不定型了,也是不能重新宣告的,例如: A = 100 ' 變數 A 是一個不定型變數了,而其內容是整數型別 A = "VB" ' 將內容的型別改成字串,沒問題 A% = 100 ' 錯誤!重新宣告變數 A 的型別,不行
常數符號 數學上的圓周率π(讀成 pi),π 就是 3.141593 這個常數的常數符號。
常數符號的定義 格式: Const 常數名稱 = 常數表示法 Const 常數名稱 As 型別名稱 = 常數表示法 Const 常數名稱+型別宣告符號 = 常數表示法 例子: Const pi = 3.141593 Const ver = "6.0 中文版" Const noon = #12:00:00# Const pi As Double = 3.141593 Const pi# = 3.141593
6-7 不同型別資料的轉換與運算
不同型別資料的轉換與運算 I% = "123" 雖然 I% 是整數型別,而 "123" 是字串型別, 但 "123" 的內容完全是數值,所以 VB會自動 將 "123" 轉成 123 再指定給 I% S$ = 123 VB 會自動將 123 轉成 "123" 再指定給字串型別的 S$。 ? #9:30# > "8:30" VB在進行比較運算以前,會先將字串型別的 "8:30" 轉成日期時間型別的 #8:30#,所以本運算式將得到 True 值。
不同型別資料的轉換與運算 -- 錯誤例 I% = "123A" 字串裡含有非數字的字元 'A',所以字串 無法轉成數值,會產生錯誤
字串與數值的運算(1) 數值型字串必須是內容符合數值表示法的字串,反之,則為文字型字串,例如: "3600" "73.59" "1.5E-13" ' 以上三個字串皆為數值型字串 "123 6" ' 含有非數字的空白字元,屬於文字型字串 "#1005" ' 含有非數字的 '#' 字元,屬於文字型字串
字串與數值的運算(2) Print "123" + "ABC" 123ABC Print "123" + 100 223 當數值型字串與字串在一起做運算時,數值型字串仍維持字串特性,所以運算符號 '+' 被視為字串的串接。 Print "123" + 100 223 當數值型字串與數值在一起做運算時,數值型字串被當作數值,所以運算符號 '+' 被視為數值的相加。 Print "123" + "100" 123100 當兩個數值型字串在一起運算時,兩個數值字串都維持字串特性,所以運算符號 '+' 還是被視為字串的串接。
字串與數值的運算(3) I% = "55" A = "55" "55" 指定給整數的 I%,會被轉成整數 ? "10" + I% 65
不同精準度的數值運算(1) 將高精準度的資料存入低精準度的變數時,將採四捨五入的方法將資料轉換成較低的精準度。例如: I% = 22.6 Print I% 23
不同精準度的數值運算(2) 將高精準度的資料存入低精準度的變數時,轉換後的數值不能超過低精準度型別的數值範圍,例如: I% = 32767.6 ‘ 錯誤,32767.6 轉換成整數後變成 ' 32768,超出整數的範圍。
不同精準度的數值運算(3) 當運算符號兩邊出現不同精準度的數值資料時VB 會以其中精準度較高者為準,將另一邊的數值換算成較高之精準度後再運算,運算之結果也以較高之精準度表示。例如: D# = 7 Print D#/6 ' 運算式以倍精準度處理 1.16666666666667 I% = 7 N! = 6 Print I%/N! ' 運算式以單精準度處理 1.166667
小心! 0.5 的四捨五入 I1% = 1.5 ‘ 都會被四捨五入成為整數 I2% = 4.5 ? I1%, I2% ’ 我們預期的結果是 2 跟 5 2 4 ‘ 但執行的結果卻是 2 跟 4 I1% = 1.5 ’ 被捨棄的 0.5 前一位是奇數,所以進位 I2% = 4.5 ‘ 被捨棄的 0.5 前一位是偶數,所以捨棄 I% = 4.5001 ' 被捨棄的 5001 不是剛好等於 5,所以與我們 ? I% ' 過去的習慣一樣,直接進位。 5
避免數值運算時的溢位錯誤 I% = 32770 ' 32770超過整數的範圍(-32768~32767), 所以產生溢位的錯誤 可能發生溢位錯誤的例子: D# = I% * 256 修正: D# = I% * 256&