为什么MS Access数据库中的"是"值为-1?

Sup*_*tch 46 sql ms-access

我正在查看MS Access中的链接数据.

"是/否"字段包含值-1表示"是",0表示"否".有人可以解释为什么这样的反直觉值被用于"是"吗?(显然,它应该是1和0)

我想有一个很好的理由,我想知道.

Oli*_*bes 50

二进制表示False0000000000000000(使用了多少位取决于实现).如果对它执行二进制NOT运算,它将被更改为1111111111111111,即True,但这是有符号整数的二进制表示-1.

的位1在最显著位置信号的符号数为负数.通过反转所有位并加1来改变数字的符号.这称为二进制补码.

让我们改变一下的标志1111111111111111.首先反转; 我们得到: 0000000000000000

然后添加一个: 0000000000000001,这是1.

这是证明1111111111111111是二进制表示的-1.


UPDATE

此外,比较这些值时不要进行比较

x = -1
Run Code Online (Sandbox Code Playgroud)

要么

x = 1
Run Code Online (Sandbox Code Playgroud)

相反,做比较

x <> 0
Run Code Online (Sandbox Code Playgroud)

这总是给出正确的结果,与所使用的惯例无关.大多数实现都将任意值视为不等于零True.

  • 我还想提出处理这些-1的建议.在某些dbs中,true在其他-1中为1.而不是比较`x = -1`或`x = 1`,比较`x <> 0`,这总是给出正确的结果. (4认同)
  • 还要注意在C(和大多数其他语言)中发生相同的事情,其中​​值0被解释为false而所有其他值被解释为true. (3认同)