2010-10-19 12 views
5

En VB6, forzar True a un número entero produce el valor -1.¿Por qué -1 es el resultado de forzar True a un entero en VB6?

¿Por qué es esto así? ¿Cuál es el razonamiento detrás de esto?

En la mayoría de los otros lenguajes de programación (C/C++, Java, Perl, Python, etc.), true se convierte en 1 cuando se fuerza en un entero. En álgebra booleana, el valor 1 se usa para representar verdadero/encendido. ¿Por qué VB6 lo hace de manera diferente?

Veo una cierta simetría elegante en el hecho de que un bitwise-not de -1 (True) arrojará 0 (False), y viceversa (porque -1 representa todos los 1s en two's complement), pero No puedo pensar en ningún beneficio práctico de esta identidad.

Por cierto, solo estoy preguntando por curiosidad: esto fue algo que me llamó la atención cuando aprendí VB6 por primera vez, y me lo he estado preguntando desde entonces.

Respuesta

7

Usted estuvo muy cerca de la razón ... Eric Lippert reveals the horrible, horrible truth:

Lo que está pasando es que VBScript no es lógico. VBScript es en modo bit. ¡Todos los llamados operadores lógicos trabajan en números, no en valores booleanos! Not, And, Or, XOr, Eqv e Imp todos convierten sus argumentos en enteros de cuatro bytes, realizan la operación lógica en cada par de bits en los enteros y devuelven el resultado. Si True es -1 y False es 0, entonces todo funciona, porque -1 tiene todos sus bits activados y 0 tiene todos sus bits desactivados.

(Como Chris Smith notes, esto ha sido cierto para distintas versiones de BASIC para un largo tiempo ...)

Tenga en cuenta que en VB.NET, operadores lógicos (es decir, los operadores que operan solamente en los tipos de datos booleanos), pero los operadores existentes seguirán felizmente realizando operaciones bit a bit si se alimentan tipos integrales. Esto ha sido una fuente frecuente de frustración para mí cuando se mueve entre C++ y VB ...

+0

Sé :) No me gusta VB;) – Onkelborg

+0

¡Interesante! Gracias por el enlace. Sabía que los operadores lógicos no se cortocircuitaron y trabajaron bit a bit para enteros, pero no me di cuenta de que eran _sólo_ en bits, incluso para valores booleanos. Y @Onkelborg, tampoco me gusta VB, tenía curiosidad por esta anomalía ;-) – Cameron

+1

Bueno :) Es la esperanza para la humanidad :) – Onkelborg

2

verdadera se representa como únicos binarios (11111111 etc ..), falsa, ya que sólo ceros (00000 etc ..)

El tipo de datos int es firmado, eso significa que el bit más significativo cuando es cero nos dice que es el valor positivo, y cuando uno es negativo. Intenta desbordar el número más grande, posible y positivo en uno, luego se "transferirá" al número negativo más grande posible.

Decimal -1 se representa como únicos. Ahí lo tienes :)

4

Esto ha sido cierto en Microsoft básico durante mucho tiempo, GW-BASIC al menos. Creo que es porque no había un tipo booleano real en esos días o un operador lógico NO diferente, por lo que para hacer que el operador NOT entero funcione tanto con verdadero como falso, usaron los valores 0 y -1. El positivo 1 no hubiera funcionado porque NO 1 no es cero.

Cuestiones relacionadas