No, esos valores no son equivalentes: &HC0FF
es -16.129, mientras que &HC0FF&
es 49407.
VBA, al ser un lenguaje bastante antiguo, usa números enteros de 16 bits de forma predeterminada.En este día y edad, más o menos quieres largos siempre en lugar de enteros, pero tienes que pedirle a VBA.
&HC0FF
es una construcción que define una constante de 16 bits desde hexadecimal. Debido a que el bit de signo en este valor se establece (activado, negativo) cuando se interpreta como un valor de 16 bits, de ahí la conversión a -16129. Podemos considerar que esto apesta, ¡pero no es un error! Cuando usa -16129 (como un entero con signo), en formato de 32 bits, los 1 se propagan a través de los 16 bits principales y eso da como resultado el valor azul de 255.
Lo que realmente quería aquí es un 32 bits constante de hexadecimal: &HC0FF&
. El &
extra en el extremo le dice a VBA que esta es una constante larga en lugar de una int. Interpretado en 32 bits, este es un valor positivo, por lo que da el equivalente decimal que está buscando.
En resumen, solicite constantes hexadecimales largas con el &
posterior.
Como un lado, esta propensión de VBA hacia 16 bits también puede mordernos cuando se usan constantes decimales, como en una expresión 16000 * 16000, que rebasará la aritmética de 16 bits. Por lo tanto, a veces es necesario utilizar también el &
final en constantes decimales (o asignar uno primero a uno largo).
¡Brillante! Exactamente lo que estaba buscando. –
Respuesta increíble. Vi la diferencia negativa, pero no tenía idea de por qué estaba sucediendo hasta que leí tu respuesta. ¡Muy informativo! – danielpiestrak