vb.net – 为什么Visual Basic中的True存储为-1?
看起来很多语言,包括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已经从那里发展而来. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |