VB.NET中True为何以-1存储而非1?

2026-04-29 07:272阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计705个文字,预计阅读时间需要3分钟。

VB.NET中True为何以-1存储而非1?

Visual Basic (VB) 中,`Not` 关键字并不直接执行按位非操作(Bitwise Not),而是用于逻辑运算中,反转操作数的布尔值。在 VB 中,`True` 的值被定义为 -1,而 `False` 的值被定义为 0。

所以,在 VB 中:- `Not True` 将返回 `False`,因为 `True` 的值是 -1,`Not` 将 -1 反转为 0。- `Not False` 将返回 `True`,因为 `False` 的值是 0,`Not` 将 0 反转为 -1。

这种机制意味着 VB 中的 `Not` 操作并不是直接对数字执行按位非操作,而是对布尔值进行反转。因此,VB 的 `Not` 实现与 C++ 或 Java 中的按位非操作不同。在 VB 中,并没有直接使用二进制补码的方式来实现按位非操作。

看起来很多语言,包括C/C++和 Java,都有逻辑Not(转换0到1,反之亦然)和Bitwise Not(按位反转AKA的补码).在Visual Basic中,Not不是简单的按位,而True的值为-1. VB是以这种方式实现的吗?

如果它是从BASIC继承的一些遗迹,那么它是否代表了1964年(BASIC)与C(1972)等后期语言时代的思维变化?

这只是猜测,但为了更简单的实现和零/非零逻辑的灵活性,可能选择逐位的AND / OR / NOT(在8位BASIC实现的时代).

你不能让语言变得太复杂,因为这回到了“家庭计算机”时代,当时CPU周期以千赫兹为单位,内存以千字节为单位,存储设备则罕见或昂贵或具有主要性(如纸带读取器或匆忙改编的录音机/播放器).

Dartmouth BASIC(这一切的开头,c 1964,bitsavers.trailing-edge.com/pdf/dartmouth/BASIC_4th_Edition_Jan68.pdf),甚至没有AND / OR / NOT,甚至不是IF的关键词.

然而,就微软的BASIC而言,Altair BASIC(c 1975,1en.wikipedia.org/wiki/Altair_BASIC)的开头就是这样. Altair BASIC有AND / OR / NOT(ia601600.us.archive.org/35/items/bitsavers_mitsMITSAl_6669937/MITS_AltairBASIC_1975.pdf),描述为“LOGICAL AND BITWISE”(第27页 – 第31页,PDF格式).与Altair BASIC一样,False / True映射到0 / -1;并且对于IF的任何非零表达式执行THEN子句.这显然是后来版本的惯用语.

(旁注,我不知道他们的“INTRUDER ALERT”示例是否真的有效,但对我来说似乎不对.)

VB.NET中True为何以-1存储而非1?

无论如何,因为AND / OR / NOT是处理整数的运算符,所以将它们添加到表达式解析器/赋值器代码中是很简单的工作.考虑到当时的单位数字千字节内存容量,添加额外的零vs非零运算符可能是一个昂贵的想法.短路AND / OR / NOT将涉及跳转,使表达式解析器/评估器成为更复杂的设计.

由于NOT 0为-1(所有位都设置为1,并以二进制补码的方式进行解释),因此本身需要-1作为True的标准(因此“LOGICAL”方面将按预期工作).

你会注意到VB.NET只是保留了那个遗留的习惯用法(就像它取代的VB6一样),但是每当你把它转换成Integer时它只是一个问题.但正如Hans Passant指出的那样,VB.NET已经从那里发展而来.

标签:T

本文共计705个文字,预计阅读时间需要3分钟。

VB.NET中True为何以-1存储而非1?

Visual Basic (VB) 中,`Not` 关键字并不直接执行按位非操作(Bitwise Not),而是用于逻辑运算中,反转操作数的布尔值。在 VB 中,`True` 的值被定义为 -1,而 `False` 的值被定义为 0。

所以,在 VB 中:- `Not True` 将返回 `False`,因为 `True` 的值是 -1,`Not` 将 -1 反转为 0。- `Not False` 将返回 `True`,因为 `False` 的值是 0,`Not` 将 0 反转为 -1。

这种机制意味着 VB 中的 `Not` 操作并不是直接对数字执行按位非操作,而是对布尔值进行反转。因此,VB 的 `Not` 实现与 C++ 或 Java 中的按位非操作不同。在 VB 中,并没有直接使用二进制补码的方式来实现按位非操作。

看起来很多语言,包括C/C++和 Java,都有逻辑Not(转换0到1,反之亦然)和Bitwise Not(按位反转AKA的补码).在Visual Basic中,Not不是简单的按位,而True的值为-1. VB是以这种方式实现的吗?

如果它是从BASIC继承的一些遗迹,那么它是否代表了1964年(BASIC)与C(1972)等后期语言时代的思维变化?

这只是猜测,但为了更简单的实现和零/非零逻辑的灵活性,可能选择逐位的AND / OR / NOT(在8位BASIC实现的时代).

你不能让语言变得太复杂,因为这回到了“家庭计算机”时代,当时CPU周期以千赫兹为单位,内存以千字节为单位,存储设备则罕见或昂贵或具有主要性(如纸带读取器或匆忙改编的录音机/播放器).

Dartmouth BASIC(这一切的开头,c 1964,bitsavers.trailing-edge.com/pdf/dartmouth/BASIC_4th_Edition_Jan68.pdf),甚至没有AND / OR / NOT,甚至不是IF的关键词.

然而,就微软的BASIC而言,Altair BASIC(c 1975,1en.wikipedia.org/wiki/Altair_BASIC)的开头就是这样. Altair BASIC有AND / OR / NOT(ia601600.us.archive.org/35/items/bitsavers_mitsMITSAl_6669937/MITS_AltairBASIC_1975.pdf),描述为“LOGICAL AND BITWISE”(第27页 – 第31页,PDF格式).与Altair BASIC一样,False / True映射到0 / -1;并且对于IF的任何非零表达式执行THEN子句.这显然是后来版本的惯用语.

(旁注,我不知道他们的“INTRUDER ALERT”示例是否真的有效,但对我来说似乎不对.)

VB.NET中True为何以-1存储而非1?

无论如何,因为AND / OR / NOT是处理整数的运算符,所以将它们添加到表达式解析器/赋值器代码中是很简单的工作.考虑到当时的单位数字千字节内存容量,添加额外的零vs非零运算符可能是一个昂贵的想法.短路AND / OR / NOT将涉及跳转,使表达式解析器/评估器成为更复杂的设计.

由于NOT 0为-1(所有位都设置为1,并以二进制补码的方式进行解释),因此本身需要-1作为True的标准(因此“LOGICAL”方面将按预期工作).

你会注意到VB.NET只是保留了那个遗留的习惯用法(就像它取代的VB6一样),但是每当你把它转换成Integer时它只是一个问题.但正如Hans Passant指出的那样,VB.NET已经从那里发展而来.

标签:T