Възможна аномалия на VBA И оператора

На моя 32-битов компютър, изпълняващ Office 2003 Excel VBA, следният код

Debug.Print ""
Debug.Print Hex(&HFF00000 And &HF00000)
Debug.Print Hex(&HFF0000 And &HF0000)
Debug.Print Hex(&HFF000 And &HF000)
Debug.Print Hex(&HFF00 And &HF00)
Debug.Print Hex(&HFF0 And &HF0)
Debug.Print Hex(&HFF And &HF)

дава следния изход

F00000
F0000
FF000   '<- Here's the Anomaly 
F00
F0
F

Това изглежда се случва само с шестнадесетичната стойност "F"; т.е. заменете всички "F" с всяка друга шестнадесетична цифра и изходът ще бъде както се очаква

Изглежда като някакъв махмурлук от 16-битовата обработка

Светът ми се разби

Чудя се дали;

1) това наистина е аномалия (или полудявам?)

if it is;

2) случва ли се с други версии на Office

3) случва ли се на 64-битови компютри

4) кое е най-елегантното решение

Всякакви улики ще бъдат оценени


person mikebinz    schedule 18.01.2014    source източник
comment
FYI: същото поведение се наблюдава при 64-битова версия на Office 2010   -  person Mitch Wheat    schedule 18.01.2014
comment
Debug.Print &HF000, CLng(&HF000), CLng("&HF000") дава -4096 -4096 61440, така че изглежда свързано с голата нотация &h...   -  person Tim Williams    schedule 18.01.2014
comment
За големи шестнадесетични числа във VBA трябва да добавите & (символът тип дълъг), за да сте сигурни, че се съхранява правилно като дълъг. напр. пробвай това Debug.Print &HF000, &HF000&   -  person Tim Williams    schedule 18.01.2014
comment
@Tim Трябва да публикувате това като отговор. Че VBA третира &H стойностите като знакови, а стойностите ‹= &HFFFF като 16-битово цяло число със знак и цитираните стойности като неподписани са наистина интересни резултати.   -  person chris neilsen    schedule 18.01.2014


Отговори (1)


За големи шестнадесетични числа във VBA трябва да добавите & (символът тип дълъг), за да сте сигурни, че се съхранява правилно като дълъг.

напр. Опитайте тази

Debug.Print &HF000, &HF000&
person Tim Williams    schedule 18.01.2014
comment
Добро; благодаря ти Тим. Интересно е да се отбележи, че моят VBA компилатор на Excel автоматично премахва крайните & от шестнадесетични стойности, по-големи от &HFFF&, напр. Debug.Print Hex(&HFF000 и &HF000&) в горния пример - person mikebinz; 18.01.2014