为什么-1是在VB6中将True强制转换为整数的结果?

时间:2010-10-19 23:37:14

标签: vb6 language-design

在VB6中,将True强制转换为整数会产生值-1。

为什么会这样?这背后的原因是什么?

在大多数其他编程语言(C / C ++,Java,Perl,Python等)中,当强制转换为整数时,true变为1。在布尔代数中,值1用于表示true / on。为什么VB6采用不同的方式呢?

我确实看到了一个优雅的对称性,即按位 - 不是-1(True)将产生0(False),反之亦然(因为-1的表示是two's complement中的所有1 ),但我想不出这种身份的任何实际好处。

顺便说一句,我只是出于好奇而被问到 - 当我第一次学习VB6时,这让我感到很奇怪,从那时起我一直在想。

3 个答案:

答案 0 :(得分:8)

你非常接近原因...... Eric Lippert reveals the horrible, horrible truth

  

发生的事情是VBScript不符合逻辑。 VBScript是按位的。所有所谓的逻辑运算符都适用于数字,而不是布尔值!不,和,或者,XOr,Eqv和Imp都将它们的参数转换为四字节整数,对整数中的每对位执行逻辑运算,并返回结果。如果True为-1且False为0则则一切正常,因为-1的所有位都打开,0的所有位都关闭。

(作为Chris Smith notes,长期以来各种各样的BASIC都是如此......)

请注意,在VB.NET中,引入了逻辑运算符(即,在布尔数据类型上仅运行 的运算符),但是如果使用整数类型,现有运算符仍将很乐意执行按位运算。在C ++和VB之间移动时,这经常是令我感到沮丧的原因......

答案 1 :(得分:4)

很长一段时间,微软基本都是这样,至少GW-BASIC。我认为这是因为当时没有实际的布尔类型或单独的逻辑NOT运算符,因此要使整数NOT运算符同时使用true和false,它们使用值0和-1。正1不起作用,因为NOT 1不为零。

答案 2 :(得分:2)

True表示为仅二进制(11111111等...),false仅为零(00000等)。

数据类型int是有符号的,这意味着msb为零时告诉我们该值为正,而当一个为负时。尝试将最大的,可能的正数溢出一个,它将“翻转”到最大的负数。

十进制-1仅表示为1。你有它:))