2010-10-19 38 views
5

在VB6中,强制True为整数产生值-1。为什么-1在VB6中将True强制为一个整数?

这是为什么?这背后的推理是什么?

在大多数其他编程语言(C/C++,Java,Perl,Python等)中,当强制为一个整数时,true变为1。在布尔代数中,值1用于表示真/开。为什么VB6的做法不同?

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

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

回答

7

你已经非常接近的原因...埃里克利珀reveals the horrible, horrible truth

这是怎么回事是VBScript是不符合逻辑的。 VBScript是按位。所有所谓的逻辑运算符都用于数字,而不是布尔值!不是,或者,XOr,Eqv和Imp都将它们的参数转换为四字节整数,对整数中的每对比特进行逻辑运算,并返回结果。如果True为-1且False为0,则所有事情都会消失,因为-1的所有位都打开,0的所有位都关闭。

(如Chris Smith notes,这一直是很长一段时间基本的各种口味的真...)

注意,在VB.NET,逻辑运算符(即,操作只有运营商在布尔数据类型上)被引入,但是现有的运算符仍然会很高兴地执行按位操作,如果是馈给整型的话。当我在C++和VB之间移动时,这一直是我经常感到沮丧的原因...

+0

我知道:)我不喜欢VB;) – Onkelborg 2010-10-20 00:09:21

+0

有趣!感谢您的链接。我知道逻辑运算符没有短路,并且对整数值按位进行操作,但是我没有意识到它们是按位进行的,即使对于布尔值也是如此。和@Onkelborg,我也不喜欢VB,我只是好奇这个异常;-) – Cameron 2010-10-20 00:57:02

+1

好:)对人类的希望:)对于人类的希望:) – Onkelborg 2010-10-20 00:58:39

2

真正被表示为唯一的二进制一(11111111等),虚假因为只有零(00000等)

数据类型INT签署,这意味着最高位时零告诉我们该值积极的,当它是负面的。尝试将最大的可能的正数溢出一个,然后将其“翻转”到可能的最大负数。

十进制-1表示为只有一个。你有它:)

4

这是在微软基本很长一段时间,至少GW-BASIC真实。我认为这是因为在那些日子里没有实际的布尔类型或单独的逻辑NOT运算符,所以为了使整数NOT运算符同时使用true和false,它们使用值0和-1。正1不会工作,因为不是1不是零。

相关问题