📅  最后修改于: 2023-12-03 15:12:34.905000             🧑  作者: Mango
在 Excel VBA 中,长整数是指超出整型(Integer)取值范围(-32,768 到 32,767)的整数类型。通常,长整数使用 Long 数据类型来存储,取值范围为 -2,147,483,648 到 2,147,483,647。然而,在处理大数字时,可能需要处理更高位的数字,这时候就需要使用长整数中的高字(High-order Word)。
那么,“高字”到底是什么呢?我们知道,每个字节(byte)可以存储 8 位二进制数,而一个长整数(Long)需要 4 个字节来存储。因此,一个长整数可以分为两个 2 个字节的部分,即 “高字” 和 “低字”(Low-order Word)。
对于一个 32 位的长整数,它的高字是最高的 16 位,可以使用位运算来获取。
Dim myLong As Long
Dim highWord As Integer
myLong = 10000000000
highWord = myLong \ 65536
上面的代码将 myLong
中的高字取到 highWord
中。\
是 VBA 中的整除符号,结果是向下取整到最接近的整数,即去掉小数点后面的数字。
现在,我们已经知道了如何获取一个长整数的高字,接下来看一下它的实际应用。在 Excel VBA 中,有时候需要处理超大数字(比如在密码学中),此时就需要用到长整数的高字。
举个例子,我们要计算一个 128 位的奇数 n 的平方。由于 n 很大,所以我们无法用常规的整数类型来存储它,因此需要将它分为两个 64 位的部分 a 和 b(a 为高字,b 为低字)。那么,n 的平方可以表示为:
n^2 = (a * 2^64 + b)^2
= a^2 * 2^128 + 2 * a * b * 2^64 + b^2
其中,a^2 和 b^2 可以用基本数据类型计算。而 2 * a * b * 2^64
这个部分,也就是 a 与 b 的乘积的二倍需要用到长整数的高字。
Function Square(n As String) As String
' 将 128 位的奇数 n 分成两个 64 位的部分 a 和 b
Dim a As String
Dim b As String
a = Left(n, 16)
b = Right(n, 16)
' 计算 a^2 和 b^2
Dim a2 As String
Dim b2 As String
a2 = CStr(CLng(a) * CLng(a))
b2 = CStr(CLng(b) * CLng(b))
' 计算 2 * a * b * 2^64 的值
Dim c As Long
Dim d As Long
c = CLng(a) * CLng(b)
d = CLng(highWord(CLng(c * 2)))
' 计算 n 的平方
Square = a2 & String$(32, "0") & _
CStr(CLng(c + d) Mod 65536 ^ 2) & _
String$(32, "0") & _
b2
End Function
上面的函数 Square
即能够计算 128 位的奇数 n 的平方。我们先将 n 按照 16 个字符为一组分为两个部分 a 和 b,然后计算 a^2 和 b^2。最后,我们需要计算 2 * a * b * 2^64 的值,这里用到了 highWord
函数来获取长整数中的高字。最后,将 a^2、2 * a * b * 2^64 和 b^2 拼接起来即得到 n 的平方。
这只是处理超大数字的其中一个例子,在实际应用中,可能还涉及到更复杂的计算。不过,对于 Excel VBA 程序员来说,掌握长整数中的高字是非常重要的一步。