当前位置 : 主页 > 编程语言 > c语言 >

vb.net – 为什么Visual Basic中的True存储为-1?

来源:互联网 收集:自由互联 发布时间:2021-06-24
看起来很多语言,包括C/C++和 Java,都有逻辑Not(转换0到1,反之亦然)和Bitwise Not(按位反转AKA的补码).在Visual Basic中,Not不是简单的按位,而True的值为-1. VB是以这种方式实现的吗? 如果它是从B
看起来很多语言,包括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,http://bitsavers.trailing-edge.com/pdf/dartmouth/BASIC_4th_Edition_Jan68.pdf),甚至没有AND / OR / NOT,甚至不是IF的关键词.

然而,就微软的BASIC而言,Altair BASIC(c 1975,1https://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已经从那里发展而来.

网友评论