2012-01-11 10 views
40

Estoy viendo datos vinculados en MS Access.¿Por qué "Sí" es un valor de -1 en la base de datos de MS Access?

Los campos "Sí/No" contienen el valor -1 para SÍ y 0 para NO. ¿Alguien puede explicar por qué ese valor contraintuitivo se usa para "Sí"? (Obviamente, debería ser 1 y 0)

Imagino que debe haber una buena razón, y me gustaría saberlo.

+0

posible duplicado de [Casting a boolean to an integer returns -1 for true?] (Http://stackoverflow.com/questions/3621037/casting-a-boolean-to-an-integer-returns-1-for -ver) – dsolimano

+12

Constante Booleana Verdadero tiene valor numérico -1. Esto se debe a que el tipo de datos Boolean se almacena como un entero con signo de 16 bits. En este constructo, -1 evalúa 16 binarios 1 (el valor booleano es verdadero) y 0 como 16 0 s (el valor booleano es falso). Esto es evidente cuando se realiza una operación Not en un valor entero con signo de 16 bits 0 que devolverá el valor entero -1, en otras palabras, True = Not False. Esta funcionalidad se vuelve especialmente útil cuando se realizan operaciones lógicas en los bits individuales de un entero como Y, O, X o No. [7] Esta definición de True también es consistente con BASIC ... –

+0

(Del artículo de Wikipedia aquí http: // es.wikipedia.org/wiki/Visual_Basic) –

Respuesta

41

La representación binaria de False es 0000000000000000 (cuántos bits se utilizan depende de la implementación). Si realiza una operación NOT binaria, se cambiará a 1111111111111111, es decir, True, pero esta es la representación binaria del entero con signo -1.

Un bit de 1 en la posición más significativa indica un número negativo para los números con signo. Cambiar el signo de un número sucede invirtiendo todos los bits y agregando 1. Esto se llama Two's complement.

Cambiemos el signo de 1111111111111111. Primero invertir; obtenemos: 0000000000000000

Entonces tuya: 0000000000000001, esto es 1.

Esta es la prueba de que 1111111111111111 era la representación binaria de -1.


ACTUALIZACIÓN

Además, al comparar estos valores no se pueden comparar

x = -1 

o

x = 1 

lugar, se comparan

x <> 0 

esto siempre da el resultado correcto, independientemente de la convención utilizada. La mayoría de las implementaciones tratan cualquier valor cero desigual como True.

+2

También me gustaría dar un consejo para manejar estos -1s. En algunos dbs true es 1 en otros -1. En lugar de comparar 'x = -1' o' x = 1', compare 'x <> 0', esto siempre da el resultado correcto. –

+2

También tenga en cuenta que las mismas cosas suceden en C (y en la mayoría de los demás idiomas) donde un valor de 0 se interpreta como falso y todos los demás valores se interpretan como verdaderos. –

-6

"Sí" es -1 porque no es nada más.

Al tratar con productos de Microsoft, especialmente uno tan antiguo como Access, no asuma que hay una buena razón para cualquier opción de diseño.

+4

Esto en realidad ** es ** una buena opción de diseño. Simplemente lo estás viendo mal. En Access 'False' y' No' son '0'; 'True' y' Yes' se definen como 'False'. En realidad, puede usar cualquier valor numérico para ser 'Sí '. – Yuck

+0

Bueno, aunque estoy de acuerdo en que puede no haber sido una elección de diseño, hay una razón para esto, como se explica en el comentario de @MartinSmith – Lamak

+0

. Hay una buena razón. Vea lo que Martin Smith escribió. –

Cuestiones relacionadas