2012-01-11 8 views
40

Sto guardando i dati collegati in MS Access.Perché "Sì" è un valore di -1 nel database di MS Access?

I campi "Sì/No" contengono il valore -1 per YES e 0 per NO. Qualcuno può spiegare perché un tale valore contro-intuitivo è usato per "Sì"? (Ovviamente, dovrebbe essere 1 e 0)

Immagino ci debba essere una buona ragione, e mi piacerebbe saperlo.

+0

possibile duplicato di [Lanciare un valore booleano a un intero restituisce -1 per vero?] (Http://stackoverflow.com/questions/3621037/casting-a-boolean-to-an-integer-returns-1-for -true) – dsolimano

+12

Costante booleana True ha un valore numerico -1. Questo perché il tipo di dati booleano è memorizzato come un intero con segno a 16 bit. In questo costrutto -1 restituisce 16 binari 1s (il valore booleano True) e 0 come 16 0s (il valore booleano False). Ciò risulta evidente quando si esegue un'operazione Not su un valore intero con segno a 16 bit 0 che restituirà il valore intero -1, in altre parole True = Not False. Questa funzionalità diventa particolarmente utile quando si eseguono operazioni logiche sui singoli bit di un numero intero come And, Or, Xor e Not. [7] Questa definizione di True è anche coerente con BASIC ... –

+0

(Dall'articolo di Wikipedia qui http: // en.wikipedia.org/wiki/Visual_Basic) –

risposta

41

La rappresentazione binaria di False è 0000000000000000 (il numero di bit utilizzati dipende dall'implementazione). Se si esegue un'operazione binaria NOT su di esso, verrà modificato in 1111111111111111, ad esempio True, ma questa è la rappresentazione binaria dell'intero con segno -1.

Un bit di 1 nella posizione più significativa segnala un numero negativo per i numeri firmati. La modifica del segno di un numero avviene invertendo tutti i bit e aggiungendo 1. Questo è chiamato Two's complement.

Cambiamo il segno di 1111111111111111. Primo invertito; otteniamo: 0000000000000000

Quindi aggiungere uno: 0000000000000001, questo è 1.

Questa è la prova che 1111111111111111 era la rappresentazione binaria di -1.


UPDATE

Inoltre, quando si confrontano questi valori non confrontare

x = -1 

o

x = 1 

invece, fare confrontare

x <> 0 

questo dà sempre il risultato corretto, indipendentemente dalla convenzione utilizzata. La maggior parte delle implementazioni considera qualsiasi valore diverso da zero come True.

+2

Vorrei anche dare un consiglio per le maniglie questi -1s. In alcuni dbs true è 1 negli altri -1. Invece di confrontare 'x = -1' o' x = 1', confronta 'x <> 0', questo dà sempre il risultato corretto. –

+2

Si noti inoltre che le stesse cose accadono in C (e nella maggior parte degli altri linguaggi) dove un valore di 0 viene interpretato come falso e tutti gli altri valori sono interpretati come veri. –

-6

"Sì" è -1 perché non è nient'altro.

Quando si ha a che fare con prodotti Microsoft, in particolare uno vecchio come Access, non presupporre che ci sia una buona ragione per qualsiasi scelta di progettazione.

+4

In realtà ** è ** una buona scelta di design. Stai solo guardando male. In Access 'False' e' No' sono '0'; 'True' e' Yes' sono definiti come non 'False'. È possibile utilizzare qualsiasi valore numerico per essere "Sì". – Yuck

+0

Beh, anche se sono d'accordo che potrebbe non essere stata una scelta di design, c'è una ragione per questo, come spiegato nel commento di @MartinSmith – Lamak

+0

C'è una buona ragione. Guarda cosa ha scritto Martin Smith. –

Problemi correlati