Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 为什么在Visual Basic中会存储为-1?_Vb.net - Fatal编程技术网

Vb.net 为什么在Visual Basic中会存储为-1?

Vb.net 为什么在Visual Basic中会存储为-1?,vb.net,Vb.net,似乎许多语言,包括C/C++和Java,都有一个逻辑Not(将0转换为1,反之亦然)和一个位Not(位反转,也称为一的补码)。在Visual Basic中,Not只是按位的,True的值为-1。VB是以这种方式实现的,有什么特别的原因吗 如果它是从BASIC遗留下来的一些痕迹,那么它是否代表了1964年(BASIC)和后来的语言如C(1972)之间思维的变化?有历史,BASIC也没有区分逻辑和按位and或运算符Not在VB.NET中执行这两项任务,如果操作数是布尔值,则为逻辑Not;如果操作数是

似乎许多语言,包括C/C++和Java,都有一个逻辑Not(将0转换为1,反之亦然)和一个位Not(位反转,也称为一的补码)。在Visual Basic中,
Not
只是按位的,
True
的值为-1。VB是以这种方式实现的,有什么特别的原因吗


如果它是从BASIC遗留下来的一些痕迹,那么它是否代表了1964年(BASIC)和后来的语言如C(1972)之间思维的变化?

有历史,BASIC也没有区分逻辑和按位and或运算符
Not
在VB.NET中执行这两项任务,如果操作数是布尔值,则为逻辑Not;如果操作数是数字,则为位求反


True主要转换为-1,以允许
运算符生成逻辑表达式结果。因此,比如说,
True和2
仍然为True,并且匹配
True和CBool(2)
,如果True转换为1,这将不起作用。缺少短路行为是旧VB版本中一个相当严重的缺陷,并激发了AndAlso和OrElse的加入。

这只是猜测,但可能选择了位和/或非位(在8位基本实现的日子里),以便在零逻辑与非零逻辑之间更容易实现和灵活

你不能把语言弄得太复杂,因为这要追溯到“家用计算机”时代,那时CPU周期以千赫兹为单位,内存以千字节为单位,存储设备以稀有、昂贵或原始的形式存在(如纸带读取器或匆忙改装的盒式录音机/放音机)

Dartmouth BASIC(这一切的开始,c 1964,)甚至没有和/或/不,甚至没有作为IF的关键字

然而,就微软的BASIC而言,它的起点是AltairBasic(c 1975,)。Altair BASIC has AND/OR/NOT(),描述为“逻辑和位”(PDF第27-31页)。在Altair BASIC中,False/True映射为0/-1;对于IF的任何非零表达式执行THEN子句。这显然是后来版本的习惯用法

(旁注,我不知道他们的“入侵者警报”示例是否真的有效,但对我来说似乎并不正确。)

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

由于
NOT 0
-1
(所有位都设置为1,并以二者的补码意义进行解释),这本身就需要将-1作为True的标准(以便“逻辑”方面可以按预期工作)


您会注意到,VB.NET只是保留了传统的习惯用法(正如它所取代的VB6一样),但这只是将其转换为整数时的一个问题。但是正如Hans Passant所指出的,VB.NET是从那里发展而来的。

-1是所有的1,不是0(0为假),取决于语言,表示方式不同,在python中,我相信它将真理存储为1。在检查布尔值时,千万不要与数字进行比较,因为不同语言的二进制表示形式不同,但只要它不是零,大多数语言都会理解,一旦你告诉它们值表示布尔值,1和-1都是真的。刚刚意识到我之前的评论可能没有回答你的问题,因为它并没有真正回答为什么他们选择将真相存储为-1,而是保留它,因为它可以解释为什么这不应该是一个问题缺少短路行为仍然是VBA中一个相当严重的缺陷:'(VB.Net最初有
BitAnd
BitOr
来执行逐位操作,但后来他们添加了
AndAlso
OrElse
,并使
运算符用于逐位操作。@Blackhawk在VBA/VB6中,可以通过
选择大小写True来执行短路行为(代替其等效的
如果…那么
)虽然我同意这一点,但我认为这相当于说VB中的所有布尔运算符都是按位的。在VB6/VBA中,短路不需要
Select
语句,只需将复合
If
语句分解为两个If语句,一个嵌套在另一个中(我认为可读性很强).非常好的研究。我想加上维基百科对此的观点,看起来是基于并谈到“与当时CPU指令的特征相关”