在VB6中,将True
强制转换为整数会产生值-1。
为什么会这样?这背后的原因是什么?
在大多数其他编程语言(C / C ++,Java,Perl,Python等)中,当强制转换为整数时,true变为1。在布尔代数中,值1用于表示true / on。为什么VB6采用不同的方式呢?
我确实看到了一个优雅的对称性,即按位 - 不是-1(True)将产生0(False),反之亦然(因为-1的表示是two's complement中的所有1 ),但我想不出这种身份的任何实际好处。
顺便说一句,我只是出于好奇而被问到 - 当我第一次学习VB6时,这让我感到很奇怪,从那时起我一直在想。
答案 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。你有它:))