2012-01-11 37 views
40

Tôi đang xem dữ liệu được liên kết trong MS Access.Tại sao "Có" giá trị -1 trong cơ sở dữ liệu MS Access?

Trường "Có/Không" chứa giá trị -1 cho CÓ và 0 cho KHÔNG. Ai đó có thể giải thích tại sao giá trị phản trực giác như vậy được sử dụng cho "Có"? (Rõ ràng, nó phải là 1 và 0)

Tôi tưởng tượng phải có lý do chính đáng và tôi muốn biết điều đó.

+0

bản sao có thể có của [Truyền một boolean thành số nguyên trả về -1 cho đúng?] (Http://stackoverflow.com/questions/3621037/casting-a-boolean-to-an-integer-returns-1-for -true) – dsolimano

+12

Hằng số Boolean Đúng có giá trị số −1. Điều này là do kiểu dữ liệu Boolean được lưu trữ dưới dạng số nguyên được ký 16 bit. Trong cấu trúc này −1 đánh giá đến 16 nhị phân 1s (giá trị Boolean True) và 0 là 16 0 (giá trị Boolean False). Điều này là rõ ràng khi thực hiện một hoạt động không trên một giá trị số nguyên 16 bit đã ký 0 sẽ trả về giá trị số nguyên −1, nói cách khác là True = Not False. Chức năng này trở nên đặc biệt hữu ích khi thực hiện các phép toán logic trên các bit riêng lẻ của một số nguyên như And, Or, Xor và Not. [7] Định nghĩa này của True cũng phù hợp với BASIC ... –

+0

(Từ bài viết Wikipedia ở đây http: // vi.wikipedia.org/wiki/Visual_Basic) –

Trả lời

41

Biểu diễn nhị phân của False0000000000000000 (số bit được sử dụng tùy thuộc vào việc triển khai). Nếu bạn thực hiện thao tác KHÔNG nhị phân trên nó, nó sẽ được đổi thành 1111111111111111, tức là True, nhưng đây là biểu diễn nhị phân của số nguyên đã ký -1.

Một chút 1 ở vị trí quan trọng nhất báo hiệu số âm cho số đã ký. Thay đổi dấu hiệu của một số xảy ra bằng cách đảo ngược tất cả các bit và thêm 1. Điều này được gọi là Two's complement.

Hãy để chúng tôi thay đổi dấu hiệu của 1111111111111111. Đầu tiên đảo ngược; chúng tôi nhận được: 0000000000000000

Sau đó thêm một: 0000000000000001, đây là 1.

Đây là bằng chứng rằng 1111111111111111 là đại diện nhị phân của -1.


CẬP NHẬT

Ngoài ra, khi so sánh các giá trị không so sánh

x = -1 

hoặc

x = 1 

thay vào đó, làm so sánh

x <> 0 

điều này luôn mang lại kết quả chính xác, độc lập với quy ước được sử dụng. Hầu hết các triển khai xử lý bất kỳ giá trị bằng nhau bằng không như True.

+2

Tôi cũng muốn đưa ra lời khuyên cho các handlings -1s này. Trong một số dbs đúng là 1 trong những người khác -1. Thay vì so sánh 'x = -1' hoặc' x = 1', hãy so sánh 'x <> 0', điều này luôn cho kết quả chính xác. –

+2

Cũng lưu ý rằng những điều tương tự xảy ra trong C (và hầu hết các ngôn ngữ khác) trong đó một giá trị 0 được hiểu là sai và tất cả các giá trị khác được hiểu là đúng. –

-6

"Có" là -1 vì không có gì khác.

Khi giao dịch với các sản phẩm của Microsoft, đặc biệt là một sản phẩm cũ như Access, đừng cho rằng có một lý do chính đáng cho bất kỳ lựa chọn thiết kế nào là.

+4

Điều này thực sự ** là ** một sự lựa chọn thiết kế tốt. Bạn đang nhìn vào nó sai. Trong Access 'False' và' No' là '0'; 'True' và' Yes' được định nghĩa là không phải 'False'. Bạn thực sự có thể sử dụng bất kỳ giá trị số nào là 'Có'. – Yuck

+0

Vâng, mặc dù tôi đồng ý rằng nó có thể không phải là một sự lựa chọn thiết kế, có một lý do cho điều này, như được giải thích trong bình luận của @MartinSmith – Lamak

+0

Có một lý do chính đáng. Xem những gì Martin Smith đã viết. –

Các vấn đề liên quan