【问题标题】:Why is "Yes" a value of -1 in MS Access database?为什么“是”在 MS Access 数据库中的值为 -1?
【发布时间】:2012-02-08 06:59:48
【问题描述】:

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

“是/否”字段包含值 -1 表示是,0 表示否。有人可以解释为什么将这种违反直觉的值用于“是”吗? (显然应该是1和0)

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

【问题讨论】:

  • 布尔常量 True 的数值为 -1。这是因为布尔数据类型存储为 16 位有符号整数。在此构造中,-1 计算为 16 个二进制 1(布尔值 True),0 计算为 16 个 0(布尔值 False)。这在对 16 位有符号整数值 0 执行 Not 操作时很明显,这将返回整数值 -1,换句话说,True = Not False。当对整数的各个位(例如 And、Or、Xor 和 Not)执行逻辑运算时,此功能变得特别有用。 [7]这个True的定义也和BASIC一致……
  • @OlivierJacot-Descombes - 直接从维基百科剪切和粘贴!
  • @MartinSmith - 即便如此,它仍然完美地回答了这个问题
  • @MartinSmith:请注意,OP 指的是 MS Access 的 YESNO 数据类型,而不是 VBA 固有的布尔类型。 YESNO 与布尔值不同,因为它也可以是空值(例如,使用外连接时),即三值逻辑,访问团队尚未定义。
  • 我在 8 位家用微机时代第一次遇到 -1 和 0 作为真假,例如在BBC BASIC。我想这是我第一次看到使用 -1 和 0 的把戏,因为它们是按位相反的......

标签: sql ms-access


【解决方案1】:

False 的二进制表示是0000000000000000(使用多少位取决于实现)。如果对它进行二进制 NOT 运算,会变成1111111111111111,即True,但这是有符号整数-1的二进制表示。

最高有效位置的1 表示有符号数的负数。通过反转所有位并加 1 来更改数字的符号。这称为Two's complement

让我们更改1111111111111111 的符号。首先反转;我们得到: 0000000000000000

然后加一个: 0000000000000001,这是1

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


更新

另外,比较这些值时不要比较

x = -1

x = 1

相反,做比较

x <> 0

这总是给出正确的结果,与使用的约定无关。大多数实现将任何不等于零的值视为True

【讨论】:

  • 我还想就如何处理这些-1 提供一些建议。在某些 dbs 中,true 为 1,而另一些为 -1。不要比较x = -1x = 1,而是比较x &lt;&gt; 0,这样总能得出正确的结果。
  • 另请注意,同样的事情发生在 C(和大多数其他语言)中,其中 0 的值被解释为 false,而所有其他值被解释为 true。
【解决方案2】:

“是”是 -1,因为它不是别的东西。

在处理 Microsoft 产品时,尤其是与 Access 一样古老的产品时,不要以为任何设计选择都有充分的理由。

【讨论】:

  • 这实际上一个很好的设计选择。你只是看错了。在访问中FalseNo0TrueYes 被定义为非 False。您实际上可以使用任何数值为Yes
  • 好吧,虽然我同意这可能不是设计选择,但正如@MartinSmith 的评论中所解释的那样,这是有原因的
  • @Lamak - 从理论上讲,我的回答与上述马丁评论给出的数学原因相同。对于布尔字段,唯一的 other 选项是 true,因此 false 与“不是其他任何东西”相同。与数学版本的结果相同,但到达那里的方式更直接(并且支持较少)。
  • @cdeszaq 您的回答表明 -1 的选择是任意的,即任何非零值都可以;这并不完全正确,虽然非零值通常被解释为 true,但 only -1 (11...11) 是 0 (00...00) 的按位非,例如按位非 1 (00...01) 不是 0,它是一个很大的负数 (11...10)。
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多