Casting a boolean to an integer returns -1 for true?

Solution 1:

Typically, a value of false is represented by 0 and a value of true is represented by any non-0 integer value. The specific value for true and false (among others) are things that you shouldn't rely on - they can potentially be implementation specific. I'm not sure what you are trying to do, but it would probably be best to not rely on True or False having any specific integer values unless you absolutely have to.

The best explanation that I could find for VB's specific behavior comes from Wikipedia:

Boolean constant True has numeric value −1. This is because the Boolean data type is stored as a 16-bit signed integer. In this construct −1 evaluates to 16 binary 1s (the Boolean value True), and 0 as 16 0s (the Boolean value False). This is apparent when performing a Not operation on a 16 bit signed integer value 0 which will return the integer value −1, in other words True = Not False. This inherent functionality becomes especially useful when performing logical operations on the individual bits of an integer such as And, Or, Xor and Not.[4] This definition of True is also consistent with BASIC since the early 1970s Microsoft BASIC implementation and is also related to the characteristics of CPU instructions at the time.

Solution 2:

A work around for your initial use would be :

 Dim i As Integer = CInt(Int(False))

This will return a 0.

 Dim i As Integer = CInt(Int(True))

This will return a 1.

Solution 3:

It seems like a gotcha, and I don't know any other examples of this behaviour.

http://msdn.microsoft.com/en-us/library/ae382yt8.aspx specifies this behaviour, with a "Don't do that, mkay" sorta remark with it. Do note further down:

Conversion in the Framework

The ToInt32 method of the Convert class in the System namespace converts True to +1.

If you must convert a Boolean value to a numeric data type, be careful about which conversion method you use.

Solution 4:

I had the same problem and used Math.Abs function on the result :)