新聞速報

        

2017年7月13日 星期四

許多DLL API函式需要傳遞不帶正負號的 整數

如何模擬不含正負號的整數?
 

Visual Basic的整數資料型別有三種:長整數Long、一般整數Integer和單位元組整數Byte。Long是32位元、含正負號的整數型別,它的有效範圍是從-2,147,483,648到+ 2,147,483,647;Integer是16位元、含正負號的整數型別,有效範圍在-32,768和+32,767之間;而Byte則是用來存放不含正負號、8個位元長的整數,其有效範圍在0到255之間,它是在Visual Basic中唯一不含正負號的整數型別。
許多API函式需要傳遞不帶正負號的16位元整數(unsigned 16-bit integer),但是,很可惜Visual Basic並不支援unsigned 16-bit整數型別。雖然還是可以用帶正負號的整數(如Integer )來呼叫這些API函式,但是當被傳遞的整數值落入了帶正負號整數的負數範圍(如Integer的-1和-32768之間)時,你必須用一些特殊的方法將需要傳給API函式的值加以轉換。在這裡,我們要介紹一些方法來模擬unsigned 16-bit整數。

注意
在編譯程式時,如果選擇將程式編譯成機器碼,你必須小心決定是否要關閉整數的溢位檢查的功能。因為關閉這個功能在某些情況下會造成不正確的整數計算結果,但關閉它的好處是可以加快整數的運算,並且有效地得到不含正負號整數的計算結果。



利用長整數的型別轉換技巧
 

從資料型別的位元長度來說,Integer型別的位元長度是16位元,可以完全容納unsigned 16-bit整數變數內含的資料;但是,unsigned16-bit整數的有效範圍是在0到65,535之間,而Integer型別有效範圍卻在-32,768和+32,767之間,因此,如果用Integer變數來模擬unsigned 16-bit整數,我們必須針對落入Integer負數範圍的整數特別加以處理,不能貿然地直接把unsigned 16-bit整數指定給Integer變數。我們可以先把unsigned 16-bit整數指定給一個Long整數變數,然後用以下這個計算式把數值指定給Integer變數:
intShort=(intLong And &H7FFF&)-(intLong And &H8000&)
在上式中,intLong存放的是原本要傳給API函式的unsigned 16-bit整數值,intShort雖然是一個Integer,但它所內含的值是經過轉換後的unsigned 16-bit整數值,因此,intShort可作為API函式的引數。
以上這個計算式運用邏輯運算子And和16進位的位元遮罩(Bit Mask)來進行位元運算,以達成把32位元整數(Long)轉換為unsigned 16位元整數的目的。
如果你要將經過轉換後的數值還原為Long整數,你可以使用以下這個運算式:
intLong = intShort And &HFFFF&
在呼叫API函式之前,應該把unsigned 16-bit整數轉換為Integer整數intShort,然後把intShort傳給API函式;而對於API函式傳回的unsigned 16-bit整數,應該把它用Integer整數intShort加以接收,然後把intShort還原為Long整數。
在這裡我們要特別提醒你,unsigned16-bit整數雖然可以被存放在含正負號的Integer變數裡傳給API函式,但是如果直接將它計算或列印的話,它會被視為負數。

沒有留言:

張貼留言