为什么Visual Basic中的True存储为-1?

时间:2016-12-16 23:40:09

标签: vb.net

似乎许多语言,包括C / C ++和Java,都有逻辑Not(转换0到1,反之亦然)和Bitwise Not(按位反转AKA的补码)。在Visual Basic中,Not只是按位,True的值为-1。 VB是以这种方式实现的吗?

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

2 个答案:

答案 0 :(得分:6)

在历史上,BASIC也没有区分逻辑和按位AND和OR运算符。 Not在VB.NET中执行这两个任务,如果操作数是布尔值,则它是逻辑NOT,如果操作数是数字,则是按位否定。

True主要转换为-1,以允许AndOr运算符生成逻辑表达式结果。所以,比方说,True And 2仍然是真的并匹配True And CBool(2),如果True转换为1则不会起作用。缺少的短路行为是旧VB版本中相当严重的缺陷并且受到启发AndAlso和OrElse的加入。

答案 1 :(得分:2)

这只是推测,但是为了更容易实现和在零对非零逻辑上的灵活性,可能选择逐位的AND / OR / NOT(在8位BASIC实现的时代)。

你不能让语言过于复杂,因为这回到了家用电脑中。 CPU周期以千赫兹为单位,内存以千字节为单位,存储设备稀少或昂贵或主要(如纸带读取器或匆忙改编的录音机/播放器)。

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

然而,就微软的BASIC而言,Altair BASIC(c 1975,https://en.wikipedia.org/wiki/Altair_BASIC)的开头就是这样。 Altair BASIC有AND / OR / NOT(https://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"示例是否真的有用,但对我来说似乎不对。)

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

由于NOT 0-1(所有位都设置为1,并在两个补码意义上解释),这本身就需要-1作为True的标准(所以" LOGICAL"方面将按预期工作。)

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