|
因測試需要,我做了Excel的VBA中做了一個小的轉(zhuǎn)換工具,把一個用C語言格式表示的十六進制數(shù) 0xXXX,轉(zhuǎn)換為用VBA語言表示的&HXXXX的表示方法,并且做幾個移位的動作。只是沒想到,這么一個簡單的事情,在VBA中遇到了不少的麻煩。就在這里簡單的說明一下:
1. 字符串求值函數(shù) val() 的結(jié)果范圍只是16位整數(shù),雖然幫助文件中寫的是8字節(jié)的6進制范圍。例如:
Debug.print VAL(“&H8C48”)結(jié)果是 : -29624
2. Hex 轉(zhuǎn)換函數(shù),正負數(shù)的處理結(jié)果不理想。這樣把一個無符號整數(shù),變成了32位負數(shù)。
debug.print Hex(VAL("&H8C48")) 結(jié)果是:FFFF8C48
那么,如何獲取正確的長整數(shù)結(jié)果呢?只能通過定義長整型變量,對這個16位數(shù)先轉(zhuǎn)換為負數(shù),在求補碼的方式進行調(diào)整了。算法如下:
dim n as long ‘如果定義為 Integer ,就會遭遇溢出錯誤
n=val("&H8C48") ’此時結(jié)果為 n=-29624,是因為 val 函數(shù)的范圍是16位
n=n+&H10000 '求負數(shù)的16位補碼, n=35912
‘此時在用Hex函數(shù),可以獲取正確的十六進制結(jié)果
debug.print hex(n) -->結(jié)果為8C48
3. 以&HXXXX形式表示的十六進制立即數(shù)的使用,如果第一位是8XXX,則同樣會認定為負數(shù)。示例如下:
dim m as long
m=1
if m>= &H8000 then m=m-&H8000
debug.print m
此時,m的值應(yīng)該是多少呢?
你或許想得到的值是 m=1,實際上,你的m值是 32769(&H8001)
如何修改呢? 把 &H8000 拆分為 &H7FFF +1,語句變化為:
if m>&H7FFF then m=m-&H7FFF-1
這時你就可以得到你想要的結(jié)果了。
如果能夠直接使用無符號整數(shù),或者能夠說明十六進制的立即數(shù)的類型屬于長整數(shù)型,都不會存在這樣的麻煩了。 |
|