ACC: How to Convert Unsigned Integers to Long Integers (96475)
The information in this article applies to:
- Microsoft Access 1.0
- Microsoft Access 1.1
- Microsoft Access 2.0
- Microsoft Access for Windows 95 7.0
- Microsoft Access 97
This article was previously published under Q96475 SUMMARY
Advanced: Requires expert coding, interoperability, and multiuser skills.
There are situations in which calling functions from external dynamic-link
libraries (DLLs) returns a 2-byte unsigned integer. Visual Basic for
Applications (or Access Basic) does not support this data type. So that
Microsoft Access can correctly evaluate this data type, you need to
convert it from an unsigned integer to a Long Integer data type.
This article assumes that you are familiar with Visual Basic for
Applications and with creating Microsoft Access applications using the
programming tools provided with Microsoft Access. For more information
about Visual Basic for Applications, please refer to your version of the
"Building Applications with Microsoft Access" manual.
NOTE: Visual Basic for Applications is called Access Basic in Microsoft
Access versions 1.x and 2.0. For more information about Access Basic,
please refer to the "Introduction to Programming" manual in Microsoft
Access version 1.x or the "Building Applications" manual in Microsoft
Access version 2.0
MORE INFORMATION
The Integer data type has a range of -32,768 to 32,767. An unsigned
integer has a range of 0 to 65,536.
Microsoft Access uses the most significant bit to set the sign of the
value. Therefore, when a value exceeds 32,767, bit 16 is set to reflect
a negative number. To evaluate an unsigned integer, you must manually
adjust bit 16.
There are two methods to convert to and from the unsigned integer type
to the Long Integer data type. The first method uses basic arithmetic
(65,536 is subtracted or added to the unsigned integer). The second uses
bit-wise operators. The arithmetic method works as well as the bit-wise
method; however, the arithmetic method may be more readable, while the
bit-wise method may be faster when executed repetitively.
Open a new module or a previously created module and enter the
following code:
'*************************************************************
'Declarations section of the module.
'*************************************************************
Option Explicit
'=============================================================
' Arithmetic Method:
' ------------------
' Create the following ar_ConvertFromUnsignedInteger& (Uint%)
' and ar_ConvertToUnsignedInteger% (Bytes&) function in the
' Module. This first function reads in an unsigned integer
' and returns the converted value as a long. The second
' function reads in a long and returns an unsigned integer.
'=============================================================
Function ar_ConvertFromUnsignedInteger& (Uint%)
If Uint% < 0 Then
ar_ConvertFromUnsignedInteger& = Uint% + 65536
Else
ar_ConvertFromUnsignedInteger% = Uint%
End If
End Function
Function ar_ConvertToUnsignedInteger% (Bytes&)
If Bytes& > 32767 Then
ar_ConvertToUnsignedInteger% = Bytes& - 65536
Else
ar_ConvertToUnsignedInteger% = Bytes&
End If
End Function
'=============================================================
' Bitwise Method:
' ---------------
' Create the following bw_ConvertFromUnsignedInteger& (Uint%)
' and bw_ConvertToUnsignedInteger% (Bytes&) function in the
' Module. This first function reads in an unsigned integer
' and returns the converted value as a long. The second
' function reads in a long and returns an unsigned integer.
' The message box statement in the second function is used
' to prevent an overflow message when the value passed to
' the function is greater than 64 kilobytes.
' To illustrate what is taking place in the first bitwise function:
' Uint% equals -23584, a value returned from an external dynamic
' link library that is an unsigned integer and must be
' converted to an long:
' 1010001111100000 (-23584)
' AND 11111111111111 (7FFF)
' ----------------
' 10001111100000 (41952)
'=============================================================
Function bw_ConvertToUnsignedInteger% (Bytes&)
Dim x%
If Bytes& > 65535 Then
MsgBox "You passed a value larger than 65535"
Exit Function
End If
x% = Bytes& And &H7FFF
bw_ConvertToUnsignedInteger% = x% Or -(Bytes& And &H8000)
End Function
Function bw_ConvertFromUnsignedInteger& (Uint%)
bw_ConvertFromUnsignedInteger& = Uint% And &HFFFF&
'-------------------------------------------------------------
' The &HFFFF& requires the & at the end of the hex number. This
' qualifies the hex number as 32-bit versus 16-bit.
'-------------------------------------------------------------
End Function
Examples of Using These Functions
An external dynamic-link library (DLL) requires and returns an unsigned
integer. The Declare statement looks like the following:
Declare Function External_Call% Lib "your.dll" (ByVal ValueToPass%)
The Declare statement uses Integer data types because Microsoft Access
does not support unsigned integers. However, the external dynamic-link
library does not know this and returns an unsigned integer that must be
converted for use; therefore, the code may appear as follows:
x% = External_Call(bw_ConvertToUnsignedInteger%(41952))
y& = bw_ConvertFromUnsignedInteger&(x%)
REFERENCES
For more information about converting code from earlier Microsoft Access
versions, search the Help Index for "Declare statement," and then
"Convert Code that calls a DLL."
Modification Type: | Minor | Last Reviewed: | 10/11/2006 |
---|
Keywords: | kbhowto kbProgramming KB96475 |
---|
|