Возможная аномалия оператора 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
К вашему сведению: такое же поведение наблюдается в 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
Хороший; спасибо Тим. Интересно отметить, что мой компилятор Excel VBA автоматически удаляет конечные значения & из шестнадцатеричных значений, превышающих &HFFF&, например Debug.Print Hex(&HFF000 And &HF000&) в приведенном выше примере. - person mikebinz; 18.01.2014