(非1)由于某种原因求值为-2

pub*_*ess 3 vba operators bitwise-operators bitwise-not

为什么(非1)评估为-2?我希望它的值为0。

在此处输入图片说明

Mat*_*don 5

1不是整数表示True-1是。

Debug.Print CInt(True) 'prints -1
Debug.Print CInt(False) 'prints 0
Run Code Online (Sandbox Code Playgroud)

布尔运算符(NotAndOrXOr)表现为“逻辑运算符”时,他们的操作数都是布尔值。如果不是,则它们表现为“按位运算符”,但事实是,它们始终是按位的。

仅因为定义为,整数值才1转换为布尔值,这意味着任何非零值都是布尔值。但是,当用于时,您只会获得正确/预期的逻辑行为。TrueTrueNot FalseTrue-1True

An Integer由16位表示,因此1

0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)

这使得Not 1

1111 1111 1111 1110
Run Code Online (Sandbox Code Playgroud)

符号位打开,因此该值为负-修剪无关紧要的数字,您将得到:

10
Run Code Online (Sandbox Code Playgroud)

这是的二进制表示形式2。因此,Not 1-2

相反,-1将是:

1111 1111 1111 1111
Run Code Online (Sandbox Code Playgroud)

而且Not -1是这样的:

0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)