代码之家  ›  专栏  ›  技术社区  ›  Cameron

为什么-1是在vb6中将true强制为整数的结果?

  •  6
  • Cameron  · 技术社区  · 15 年前

    在vb6中,强制 True 整数的结果是-1。

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

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

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

    顺便说一句,我只是出于好奇才问这个问题——当我第一次学习vb6时,这让我觉得很奇怪,从那以后我就一直在想。

    3 回复  |  直到 15 年前
        1
  •  8
  •   Community Mohan Dere    9 年前

    你离原因很近…利珀特 reveals the horrible, horrible truth :

    现在的情况是vbscript不符合逻辑。vbscript是按位的。所有所谓的逻辑运算符都用于数字,而不是布尔值!not、and、or、xor、eqv和imp都将其参数转换为四字节整数,对整数中的每对位执行逻辑运算,并返回结果。如果真是-1,假是0,那么一切都会好起来,因为-1打开了所有的位,0关闭了所有的位。

    (AS) Chris Smith notes 很长一段时间以来,各种口味的基本款都是如此……)

    注意,在vb.net中,逻辑运算符(即操作 只有 在布尔数据类型上)被引入,但是现有的操作符仍然可以很高兴地执行位操作(如果是fed整型的话)。当我在C++和VB之间移动时,这是我经常遇到的挫折感。

        2
  •  4
  •   Chris Smith    15 年前

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

        3
  •  2
  •   Onkelborg    15 年前

    真仅表示为二进制(11111111等),假仅表示为零(00000等)。

    数据类型int是有符号的,这意味着当0告诉我们该值为正时的msb,当0告诉我们该值为负时的msb。尽量把最大的、可能的、正数一个一个地溢出,它就会“翻滚”到最大的、可能的负数。

    十进制-1只表示为1。给你:)

    推荐文章