PowerBasic为32位编译器,没有提供64位无符号长整形的数据类型,但是在日常编程中对于64位无符号长整形数据的操作越来越普遍。
所以才有了在32位编译器下,对64位数据操作的研究。
首先定义一个新的数据类型,长度8字节,64位
TYPE uint64 DWORD
HighBit AS DWORD
LowBit AS DWORD
END TYPE
然后再定义三个宏操作。
'========================================================
'a为任意类型数据
'========================================================
MACRO HIBYT64(a) = a\(2^32) '取高位字节
MACRO LOBYT64(a) = IIF(a>(2^63-1),a\(2^32),(a AND &HFFFFFFFF)) '取低位字节
'========================================================
'任意数据类型强制转换为ULONG型
'a为任意数据类型,b为自定义的uint64数据类型
'========================================================
MACRO ToUint64(a, b)
b.highbit = HIBYT64(a)
b.lowbit = LOBYT64(a)
END MACRO
'--------------------------------------------------------
既然有了无符号长整型数据类型,那么需要输出显示结果的话,还需要再添加一个宏。将高低位合并后的结果输出显示。
MACRO Uint64ToStr(a) = FORMAT$(a.highbit*(2^32) + a.lowbit, "#")
实例测试:
FUNCTION PBMAIN () AS LONG
LOCAL a AS uint64
LOCAL b AS uint64
ToUint64(14757395258967641292, a)
MEMORY COPY VARPTR(a), VARPTR(b), SIZEOF(uint64)
MSGBOX "高32位:"+STR$(a.highbit)+$CRLF+_
"低32位:"+STR$(a.lowbit) +$CRLF+_
"64位:" +Uint64ToStr(b)
END FUNCTION
输出结果:
如果使用PB的QUAD数据类型(有符号长整型64位),则得到的是一个大的负数值。而不是我们期待的值。