文章編號: 189323 - 上次校閱: 2006年8月14日 - 版次: 3.2

如何在帶正負號及不帶正負號的數字間轉換

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

Visual Basic for Applications 只支援帶正負號的 2 及 4 位元組整數,而其他語言 (如 C) 則是帶正負號及不帶正負號的整數兩者都能支援。本文會介紹在帶正負號及不帶正負號 4 位元整數間及帶正負號及不帶正負號 2 位元整數間的轉換函式。

其他相關資訊

在 VBA 中,整數值的範圍從 -32768 到 +32767,而 Long 值的範圍從 -2147483648 到 2147483647。進行 API 呼叫或呼叫以 C 撰寫的 DLL 時,可能會要求您傳入或接收範圍從 0 到 65535 或 0 到 4294967296 的不帶正負號值。下面提供的轉換函式可將不帶正負號的整數轉換為 Long,也可因為輸入及顯示或其他計算的目的從不帶整負號的 Long 轉換為 Double。

四種函式為:
UnsignedToLong
LongToUnsigned
UnsignedToInteger
IntegerToUnsigned

UnsignedToLong

此函式會使用包含在不帶正負號 Long 範圍內之值的 Double,並傳回 Long,讓您傳到需要不帶正負號 Long 的 API。

LongToUnsigned

此函式會使用來自 API 的不帶正負號 Long,並將其轉換為 Double 以顯示或計算。

UnsignedToInteger

此函式會使用包含在不帶正負號整數範圍內之值的 Long,並傳回整數,讓您傳到需要不帶正負號整數的 API。

IntegerToUnsigned

此函式會使用來自 API 的不帶正負號整數,並將其轉換為 Long 以顯示或計算。
   Declare Function MyAPI Lib "xxx" (Value As Long) As Long
   Dim uResult As Long
   uResult = MyAPI(UnsignedToLong(3300000000))
   Debug.Print "Return Code: " & LongToUnsigned(uResult)
				
在上述範例中,MyAPI API 會接受不帶正負號的 Long 做為參數,並傳回不帶正負號的 Long 做為結果程式碼。因為 VBA 只瞭解帶正負號的 Long,所以 DECLARE 陳述式會使用帶正負號的 Long。UnsignedToLong
function converts a number outside the range of signed Long (but within the
				
函數會將帶正負號 Long 範圍外 (但在未帶正負號 Long 的範圍內) 的數字轉換為帶正負號的 Long 以呼叫 API。LongToUnsigned 函式則會執行相反的轉換。

如果不使用這些函式,可能會將輸入引數指定為帶正負號的 Long (此案例為 -994967296),且會將傳回值顯示為帶正負號的值,該值也可能是負數且不易瞭解。

逐步範例

  1. 建立新的 VBA 專案。
  2. 將下列程式碼加入模組中:
          Option Explicit
    
          Private Const OFFSET_4 = 4294967296#
          Private Const MAXINT_4 = 2147483647
          Private Const OFFSET_2 = 65536
          Private Const MAXINT_2 = 32767
    
          Function UnsignedToLong(Value As Double) As Long
            If Value < 0 Or Value >= OFFSET_4 Then Error 6 ' Overflow
            If Value <= MAXINT_4 Then
              UnsignedToLong = Value
            Else
              UnsignedToLong = Value - OFFSET_4
            End If
          End Function
    
          Function LongToUnsigned(Value As Long) As Double
            If Value < 0 Then
              LongToUnsigned = Value + OFFSET_4
            Else
              LongToUnsigned = Value
            End If
          End Function
    
          Function UnsignedToInteger(Value As Long) As Integer
            If Value < 0 Or Value >= OFFSET_2 Then Error 6 ' Overflow
            If Value <= MAXINT_2 Then
              UnsignedToInteger = Value
            Else
              UnsignedToInteger = Value - OFFSET_2
            End If
          End Function
    
          Function IntegerToUnsigned(Value As Integer) As Long
            If Value < 0 Then
              IntegerToUnsigned = Value + OFFSET_2
            Else
              IntegerToUnsigned = Value
            End If
          End Function
    						
  3. 僅適用 Visual Basic:執行專案後暫停專案。
  4. 在 [即時運算/偵錯] 視窗中輸入下列:
          ?UnsignedToLong(3300000000)
          ?LongToUnsigned(-55)
          ?UnsignedToInteger(45000)
          ?IntegerToUnsigned(-3000)
  5. 您會得到下列結果:
    -994967296
    4294967241
    -20536
    62536

?考

如需詳細資訊,請參閱「Microsoft 知識庫」中的下列文件:
112673? (http://support.microsoft.com/kb/112673/ ) How To Pass & Return Unsigned Integers to DLLs from VB

這篇文章中的資訊適用於:
  • Microsoft Visual Basic for Applications 5.0
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
關鍵字:?
kbhowto KB189323
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。