新觀念的VB6教本ch063. 資料型別的觀念資料型別的觀念
---- 比較它們的差異比較它們的差異
1+11+1 等於等於 22
"1"+"1""1"+"1" 等於等於 1111
Print #10/5/97# > #8/5/97#Print #10/5/97# > #8/5/97# 得到得到 TrueTrue
Print "10/5/97" > "8/5/97"Print "10/5/97" > "8/5/97" 得到得到 FalseFalse
Print 4.0/3Print 4.0/3 印出印出 1.333333333333331.33333333333333
Print 4/3Print 4/3 印出印出 1.3333331.333333 (VB 5.0(VB 5.0 版版 ))
Print 4/3Print 4/3 印出印出 1.333333333333331.33333333333333
(VB 6.0(VB 6.0 版版 ))
5. VBVB 的資料型別的資料型別
資料類別資料類別 資料型別資料型別 型別的英文名稱型別的英文名稱
字串字串 字串字串 StringString
日期時間日期時間 日期時間日期時間 DateDate
布林布林 布林布林 BooleanBoolean
數值數值 整數整數
長整數長整數
倍精準度倍精準度
單精準度單精準度
IntegerInteger
LongLong
DoubleDouble
SingleSingle
7. 檢驗資料的型別檢驗資料的型別
? TypeName(#11/25/97#)? TypeName(#11/25/97#) '' 日期日期
DateDate '' 日期時間型別日期時間型別
? TypeName(#12:35:50#)? TypeName(#12:35:50#) '' 時間時間
DateDate '' 日期時間型別日期時間型別
? TypeName(True)? TypeName(True) '' 布林資料布林資料
BooleanBoolean '' 布林型別布林型別
8. 檢驗數 資料的型別值檢驗數 資料的型別值
? TypeName(1.5)? TypeName(1.5) 小數小數
DoubleDouble 倍精準度型別倍精準度型別
? TypeName(4.9E+12)? TypeName(4.9E+12) 浮點數浮點數
DoubleDouble 倍精準度型別倍精準度型別
? TypeName(100)? TypeName(100) 整數整數
IntegerInteger 整數型別整數型別
? TypeName(100000)? TypeName(100000) 整數整數
LongLong 長整數型別長整數型別
? TypeName(123456789012)? TypeName(123456789012) 整數整數
DoubleDouble 倍精準度型別倍精準度型別
10. 整數型別整數型別
所佔用的空間是所佔用的空間是 2 bytes2 bytes ,也就是,也就是 1616 個個
位元位元 (bit)(bit) 。。
共可表示共可表示 221616
=65536=65536 個整數 ,又因為其值個整數 ,又因為其值
中一半的數要用來表示負數,所以整數中一半的數要用來表示負數,所以整數
的範圍在的範圍在 -32768-32768 ~~ 3276732767 之間。之間。
例如:例如:
2048020480 '' 數 介於值數 介於值 -32768-32768 ~~ 3276732767 之之
間,所以會存成整數型別間,所以會存成整數型別
11. 長整數型別長整數型別
所佔用的空間是所佔用的空間是 4 bytes4 bytes 等於等於 3232 個位元個位元 (bit)(bit) 。。
可表示的整數個數有可表示的整數個數有 223232
=2=21616
×2×21616
=65536×65536=65536×65536 ,,
是整數型別的是整數型別的 6553665536 倍。倍。
其數 範圍介於值其數 範圍介於值 -2147483648-2147483648 ~~ 21474836472147483647
之間,約之間,約 99 ~~ 1010 位數。位數。如果數 超過整數型值如果數 超過整數型值
別的容量,但可以放得進別的容量,但可以放得進 4 bytes4 bytes 裡面,則會被裡面,則會被
存成長整數型別,例如:存成長整數型別,例如:
25002500 '' 在整數範圍之內在整數範圍之內 ,, 所以存成整數型所以存成整數型
別別
5600056000 '' 超過整數範圍超過整數範圍 ,, 但是在長整數範圍但是在長整數範圍
之內之內 ,, 所以存成長整數型別所以存成長整數型別
13. 如果一個數 被表示成小數或浮點數,值如果一個數 被表示成小數或浮點數,值 VBVB 都會將都會將
它存成倍精準度型別。它存成倍精準度型別。
例如:例如:
56.39656.396 小數表示法,存成倍精準度型別小數表示法,存成倍精準度型別
1.8765E+651.8765E+65 浮點數表示法,存成倍精準度型別浮點數表示法,存成倍精準度型別
1000.01000.0 雖然等於整數雖然等於整數 10001000 ,但卻是小數,但卻是小數
表示法,依然存成倍精準度型別表示法,依然存成倍精準度型別
資料被存成倍精準度型別的情況一資料被存成倍精準度型別的情況一
15. 倍精準度型別的有效位數為倍精準度型別的有效位數為 1515 位,如果位,如果
數 表示法中的位數超過值數 表示法中的位數超過值 1515 位,位, VBVB 將將
會對多餘的位數採四捨五入法,例如:會對多餘的位數採四捨五入法,例如:
Print 1.23456789012345678Print 1.23456789012345678
1.234567890123461.23456789012346
Print 987654321098765432Print 987654321098765432
9.87654321098765E+179.87654321098765E+17
資料被存成倍精準度型別的情況二資料被存成倍精準度型別的情況二 (2)(2)
16. 單精準度型別的有效位數有單精準度型別的有效位數有 77 位,但是當我們位,但是當我們
表示一個位數低於表示一個位數低於 77 位的實數時,位的實數時, VBVB 還是不還是不
會將該數 存成單精準度型別,例如:值會將該數 存成單精準度型別,例如:值
1.3351.335
會被存成倍精準度型別,是因為會被存成倍精準度型別,是因為 VBVB 內部作法內部作法
的關係,不是因為的關係,不是因為 1.3351.335 無法存成單精準度型無法存成單精準度型
別。別。
資料被存成倍精準度型別的情況二資料被存成倍精準度型別的情況二 (3)(3)
17. 我們可以主動要求我們可以主動要求 VBVB 將資料存成單精將資料存成單精
準度型別,方法是在數 後面加上 ‘值準度型別,方法是在數 後面加上 ‘值 !’!’ ,,
例如:例如:
1.335!1.335!
用用 !! 符號,要求符號,要求 VBVB 將將 1.3351.335 存存
成單精準度型別成單精準度型別
資料被存成倍精準度型別的情況二資料被存成倍精準度型別的情況二 (4)(4)
18. 當兩整數相除時,對當兩整數相除時,對 VB5VB5 來說,其結果也是存來說,其結果也是存
成單精準度型別,例如:成單精準度型別,例如: (( 不過對不過對 VB6VB6 來說,來說,
卻是存成倍精準度型別卻是存成倍精準度型別 ))
Print 4/3Print 4/3 兩整數相除兩整數相除 VB5VB5
1.3333331.333333
Print 4/3Print 4/3 兩整數相除兩整數相除 VB6VB6
1.333333333333331.33333333333333
Print 4.0/3Print 4.0/3 這是倍精準數除以整數這是倍精準數除以整數
1.333333333333331.33333333333333
資料被存成倍精準度型別的情況二資料被存成倍精準度型別的情況二
(VB5 vs. VB6)(VB5 vs. VB6)
20. VBVB 如何決定資料的型別如何決定資料的型別
如果是整數的表示法,依序判斷以下數 範圍:值如果是整數的表示法,依序判斷以下數 範圍:值
1.1. 數 介於值數 介於值 -32768-32768 ~~ 3276732767 之間,存成整數型別之間,存成整數型別
。。
2.2. 數 介於值數 介於值 -2147483648-2147483648 ~~ 21474836472147483647 之間,存之間,存
成長整數型別。成長整數型別。
3.3. 數 超過長整數範圍,存成倍精準度型別。值數 超過長整數範圍,存成倍精準度型別。值
4.4. 如果不是整數表示法,一律存成倍精準度型別。如果不是整數表示法,一律存成倍精準度型別。
21. 利用利用 TypeNameTypeName 來檢驗來檢驗
Print TypeName(1024)Print TypeName(1024)
IntegerInteger
Print TypeName(56000)Print TypeName(56000)
LongLong
Print TypeName(10.98 )Print TypeName(10.98 )
DoubleDouble
24. 數 型別的型別宣告符號值數 型別的型別宣告符號值 ---- 例例
子子
1536&1536& '' 雖然雖然 15361536 只要存成整數型別只要存成整數型別
即即 可,但我們 利用可,但我們 利用 && 符號將它符號將它
宣宣 告成長整數型別告成長整數型別
48000#48000# '' 雖然雖然 4800048000 只要存成長整數型只要存成長整數型
別別 即可,但我們利用即可,但我們利用 ## 符號將它符號將它
宣宣 告成倍精準度型別告成倍精準度型別
123%123% ' 123' 123 原本就會存成整數型別,再原本就會存成整數型別,再
加上加上 %% 的的 整數型別宣告符整數型別宣告符
號,有號,有 點多餘,卻是正確的點多餘,卻是正確的
26. 型別宣告的注意事項型別宣告的注意事項 ---- 例子例子
Print 100.0%Print 100.0%
錯誤錯誤 ,, 雖然雖然 100.0100.0 等於等於
100,100, 但這不是整數表示法但這不是整數表示法
,, 不能宣告成整數型別。不能宣告成整數型別。Print 48000%Print 48000%
錯誤,將超過整數範圍的錯誤,將超過整數範圍的
4800048000 宣告成整數。宣告成整數。
Print 2.34567896!Print 2.34567896!
2.3456792.345679
位數位數 99 位的數 宣告成有值位的數 宣告成有值
效位效位 77 位的單精準度型別位的單精準度型別
,多餘的兩位,多餘的兩位 (96)(96) 會被四會被四
捨五入。捨五入。
28. 用用 TypeNameTypeName 來檢驗變數的型別來檢驗變數的型別
(( 11 ))
A = 100A = 100
? TypeName(A)? TypeName(A)
IntegerInteger
將整數型別的將整數型別的 100100 指定給變數指定給變數 AA
檢 變數查檢 變數查 AA 的型別的型別
此時變數此時變數 AA 是整數型別是整數型別
A = "VB"A = "VB"
? TypeName(A)? TypeName(A)
StringString
重新指定字串型別的重新指定字串型別的 "VB""VB" 給變數給變數
AA
變數變數 AA 的型別也變成了字串型別的型別也變成了字串型別
29. 用用 TypeNameTypeName 來檢驗變數的型別來檢驗變數的型別
(( 22 ))
L& = 65500L& = 65500
? TypeName(L&)? TypeName(L&)
LongLong
使用使用 && 符號將變數符號將變數 LL 宣告成長宣告成長
整整
數型數型
別別
長整數型別長整數型別L& = 100L& = 100
? TypeName(L&)? TypeName(L&)
LongLong
將整數型別的將整數型別的 100100 指定給指定給 LL 之之
後,後,
……
30. 不定型不定型 (Variant)(Variant) 變數變數 ::變數未加型別宣告符號,其型別會隨著資料的內容變數未加型別宣告符號,其型別會隨著資料的內容
來改變。來改變。
定型定型變數:變數加了型別宣告符號,其型別固定,不會隨著指定給它的資變數:變數加了型別宣告符號,其型別固定,不會隨著指定給它的資
料來改變。料來改變。
每一個定型變數都屬於某一特定型別,例如每一個定型變數都屬於某一特定型別,例如 L&L& 是長整數型別是長整數型別 (( 因為最後因為最後
有有 && 符號符號 )) ,在指定資料時,它只接受可以轉成這個型別的資料。,在指定資料時,它只接受可以轉成這個型別的資料。
不定型變數的型別將隨著指定給它的資料來變,定型變數的型別則是永遠不定型變數的型別將隨著指定給它的資料來變,定型變數的型別則是永遠
不變不變。。
不定型變數與定型變數不定型變數與定型變數 (( 11 ))
31. L& = 34896L& = 34896 ' 34896' 34896 同樣是長整數型別,自然可接受同樣是長整數型別,自然可接受
L& = 100L& = 100 ' 100' 100 是整數型別,也可接受是整數型別,也可接受
L& = “VB”L& = “VB” '' 錯誤!字串 “錯誤!字串 “ VB”VB” 無法轉換成長整數無法轉換成長整數
L& = “82500”L& = “82500” '' 雖然 “雖然 “ 82500”82500” 是字串,但可以轉成是字串,但可以轉成
? TypeName(L&)? TypeName(L&) '' 長整數,所以可接受長整數,所以可接受
LongLong '' 證明證明 LL 還是長整數還是長整數
L& = 9.8L& = 9.8 '' 將將 9.89.8 轉換成整數,只好四捨五入轉換成整數,只好四捨五入
Print L&Print L&
1010
L& = 7.85E+12L& = 7.85E+12 '' 錯誤錯誤 , 7.85E+12, 7.85E+12 超過長整數的數超過長整數的數
範圍值範圍值
不定型變數與定型變數不定型變數與定型變數 (( 22 ))
32. A = 34896A = 34896 '' 此時變數此時變數 AA 是「長整數」型別是「長整數」型別
A = 100A = 100 '' 變數變數 AA 變成了「整數」型別變成了「整數」型別
A = “VB”A = “VB” '' 變數變數 AA 又變成「字串」型別又變成「字串」型別
A = “82500”A = “82500” '' 變數變數 AA 還是「字串」型別還是「字串」型別
? TypeName(A)? TypeName(A)
StringString '' 證明變數證明變數 AA 還是字串還是字串
A = 9.8A = 9.8 '' 變數變數 AA 變成「倍精準度」型別變成「倍精準度」型別
Print APrint A
9.89.8 '' 沒有類似變數沒有類似變數 LL 四捨五入四捨五入
的情形的情形
A = 7.85E+12A = 7.85E+12 '' 變數變數 AA 還是倍精準度型別,還是倍精準度型別,
沒有類似變數沒有類似變數 LL 產生錯誤的情形產生錯誤的情形
不定型變數與定型變數不定型變數與定型變數 (( 33 ))
34. DimDim 敘述敘述 (1)(1)
格式:格式:
使用例一:使用例一:
使用例二:使用例二:
Dim 變數名稱 As 英文型別名稱
變數名稱 型別名稱
Dim S As String ' 將變數 S宣告成字串型別
Dim X As Date ' 將變數 X 宣告成日期時間型別
Dim A 省略了 "As 英文型別名稱 ", 則變數 A
將是一個不定型變數
35. DimDim 敘述 – 注意事項敘述 – 注意事項
DimDim 敘述不能在即時運算視窗裡面使用敘述不能在即時運算視窗裡面使用
,只能在程式視窗裡面使用,只能在程式視窗裡面使用。。
36. DimDim 敘述敘述 (2)(2)
格式:格式: DimDim 變數名稱變數名稱 ++ 型別宣告符號型別宣告符號
Dim A% ' 將變數 A 宣告成整數型別
Dim S$ ' 將變數 S 宣告成字串型別
Dim V ' 未加型別宣告符號,表示不定型變數
38. Private Sub Command1_Click()Private Sub Command1_Click()
Dim S1 As StringDim S1 As String ' S1' S1 是變動長度字串是變動長度字串
Dim S2 As String * 80Dim S2 As String * 80 ' S2' S2 是固定長度字串是固定長度字串
S1 = "abcde"S1 = "abcde"
S2 = "12345"S2 = "12345" '' 利用利用 LenLen 計算字串的長度計算字串的長度
Print "S1Print "S1 長度長度 ="; Len(S1), "S2="; Len(S1), "S2 長度長度 ="; Len(S2)="; Len(S2)
S1 = "abcdefghij"S1 = "abcdefghij"
S2 = "1234567890"S2 = "1234567890"
Print "S1Print "S1 長度長度 ="; Len(S1), "S2="; Len(S1), "S2 長度長度 ="; Len(S2)="; Len(S2)
End SubEnd Sub
固定長度字串 – 實例固定長度字串 – 實例 (1)(1)
39. 上一頁程式輸出結果:上一頁程式輸出結果:
S1S1 長度長度 = 5= 5 S2S2 長度長度 = 80= 80
S1S1 長度長度 = 10= 10 S2S2 長度長度 = 80= 80
可見固定長度字串的長度是固定的,不可見固定長度字串的長度是固定的,不
會隨著字串的內容而改變其長度。會隨著字串的內容而改變其長度。
變動長度字串則會隨著字串的內容而改變動長度字串則會隨著字串的內容而改
變其長度。變其長度。
固定長度字串 – 實例固定長度字串 – 實例 (2)(2)
42. 常數符號常數符號
數學上的圓周率數學上的圓周率 π(π( 讀成讀成 pi)pi) ,, ππ 就是就是
3.1415933.141593 這個常數的這個常數的常數符號常數符號。。
S = pi * R ^ 2
S = 3.141593 * R ^ 2
運算式中放的是 常數符號
運算式中放的是 常數值
43. 格式:格式:
ConstConst 常數名稱常數名稱 == 常數表示法常數表示法
ConstConst 常數名稱常數名稱 AsAs 型別名稱型別名稱 == 常數表示法常數表示法
ConstConst 常數名稱常數名稱 ++ 型別宣告符號型別宣告符號 == 常數表示法常數表示法
例子:例子:
Const pi = 3.141593Const pi = 3.141593
Const ver = "6.0Const ver = "6.0 中文版中文版 ""
Const noon = #12:00:00#Const noon = #12:00:00#
Const pi As Double = 3.141593Const pi As Double = 3.141593
Const pi# = 3.141593Const pi# = 3.141593
常數符號的定義常數符號的定義
45. 不同型別資料的轉換與運算不同型別資料的轉換與運算
I% = "123"I% = "123"
雖然雖然 I%I% 是整數型別,而是整數型別,而
"123""123" 是字串型別, 但是字串型別, 但 "123""123"
的內容完全是數 ,所以值的內容完全是數 ,所以值 VBVB
會自動 將會自動 將 "123""123" 轉成轉成 123123 再再
指定給指定給 I%I%
S$ = 123S$ = 123
VBVB 會自動將會自動將 123123 轉成轉成 "123""123"
再指定給字串型別的再指定給字串型別的 S$S$ 。。
? #9:30# > "8:30"? #9:30# > "8:30"
VBVB 在進行比較運算以前,會在進行比較運算以前,會
先將字串型別的先將字串型別的 "8:30""8:30" 轉成轉成
日期時間型別的日期時間型別的 #8:30##8:30# ,所,所
46. I% = "123A"I% = "123A"
字串裡含有非數字的字元字串裡含有非數字的字元
'A''A' ,所以字串 無法轉成,所以字串 無法轉成
數 ,會產生錯誤值數 ,會產生錯誤值
不同型別資料的轉換與運算不同型別資料的轉換與運算 ---- 錯誤錯誤
例例
47. 字串與數 的運算值字串與數 的運算值 (1)(1)
數 型字串必須是內容符合數 表示法的字值 值數 型字串必須是內容符合數 表示法的字值 值
串,反之,則為文字型字串,例如:串,反之,則為文字型字串,例如:
"3600""3600"
"73.59""73.59"
"1.5E-13""1.5E-13" '' 以上三個字串皆為數 型字串值以上三個字串皆為數 型字串值
"123 6""123 6" '' 含有非數字的空白字元,屬於文字型字串含有非數字的空白字元,屬於文字型字串
"#1005""#1005" '' 含有非數字的含有非數字的 '#''#' 字元,屬於文字型字串字元,屬於文字型字串
48. Print "123" + "ABC"Print "123" + "ABC"
123ABC123ABC
當數 型字串與字串在一起做值當數 型字串與字串在一起做值
運算時,數 型字串仍維持字值運算時,數 型字串仍維持字值
串特性,所以運算符號串特性,所以運算符號 '+''+' 被被
視為字串的串接。視為字串的串接。
Print "123" + 100Print "123" + 100
223223
當數 型字串與數 在一起做值 值當數 型字串與數 在一起做值 值
運算時,數 型字串被當作數值運算時,數 型字串被當作數值
,所以運算符號值,所以運算符號值 '+''+' 被視為被視為
數 的相加。值數 的相加。值
Print "123" + "100"Print "123" + "100"
123100123100
當兩個數 型字串在一起運算值當兩個數 型字串在一起運算值
時,兩個數 字串都維持字串值時,兩個數 字串都維持字串值
特性,所以運算符號特性,所以運算符號 '+''+' 還是還是
字串與數 的運算值字串與數 的運算值 (2)(2)
49. I% = "55"I% = "55"
A = "55"A = "55"
"55""55" 指定給整數的指定給整數的 I%I% ,會被,會被
轉成整數轉成整數? "10" + I%? "10" + I%
6565
變數變數 II 是整數型別,所以是整數型別,所以 "10""10"
被視為數值被視為數值? "10" + A? "10" + A
10551055
AA 是不定型變數,而其內容為是不定型變數,而其內容為
"55""55" ,所以,所以 "10""10" 維持字串本維持字串本
性性
字串與數 的運算值字串與數 的運算值 (3)(3)
50. 不同精準度的數 運算值不同精準度的數 運算值 (1)(1)
將高精準度的資料存入低精準度的變數將高精準度的資料存入低精準度的變數
時,將採四捨五入的方法將資料轉換成時,將採四捨五入的方法將資料轉換成
較低的精準度。例如:較低的精準度。例如:
I% = 22.6I% = 22.6
Print I%Print I%
2323
52. 當運算符號兩邊出現不同精準度的數 資料時值當運算符號兩邊出現不同精準度的數 資料時值
VBVB 會以其中精準度較高者為準,將另一邊的會以其中精準度較高者為準,將另一邊的
數 換算成較高之精準度後再運算,運算之結值數 換算成較高之精準度後再運算,運算之結值
果也以較高之精準度表示。例如:果也以較高之精準度表示。例如:
不同精準度的數 運算值不同精準度的數 運算值 (3)(3)
D# = 7
Print D#/6 ' 運算式以倍精準度處理
1.16666666666667
I% = 7
N! = 6
Print I%/N! ' 運算式以單精準度處理
1.166667
53. 小心小心 ! 0.5! 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
54. 避免數 運算時的溢位錯誤值避免數 運算時的溢位錯誤值
I% = 32770I% = 32770
' 32770' 32770 超過整數的範圍超過整數的範圍 (-32768(-32768 ~~ 32767),32767),
所以產生所以產生溢位溢位的錯誤的錯誤
可能發生溢位錯誤的例子:可能發生溢位錯誤的例子:
D# = I% * 256D# = I% * 256
修正:修正:
D# = I% * 256&D# = I% * 256&