Ответ 1
Когда вы производите ненулевое число до Boolean
, оно будет оцениваться как True
. Например:
Dim value As Boolean = CBool(-1) ' True
Dim value1 As Boolean = CBool(1) ' True
Dim value2 As Boolean = CBool(0) ' False
Однако, как вы указываете, всякий раз, когда вы добавляете Boolean
, который установлен в True
, на Integer
, он будет оценивать -1, например:
Dim value As Integer = CInt(CBool(1)) ' -1
Причиной этого является то, что -1
- это целое число с подписью, где все его биты равны 1. Так как a Boolean
хранится как 16-разрядное целое число, проще переключаться между истинными и ложные состояния, просто НЕиспользуя все биты, а не только НЕ наименее значимые из битов. Другими словами, чтобы True
был 1
, его нужно было бы сохранить следующим образом:
True = 0000000000000001
False = 0000000000000000
Но проще просто сохранить его так:
True = 1111111111111111
False = 0000000000000000
Причина этого проще, потому что на низком уровне:
1111111111111111 = NOT(0000000000000000)
В то время как:
0000000000000001 <> NOT(0000000000000000)
0000000000000001 = NOT(1111111111111110)
Например, вы можете реплицировать это поведение, используя переменные Int16
, такие как:
Dim value As Int16 = 0
Dim value2 As Int16 = Not value
Console.WriteLine(value2) ' -1
Это было бы более очевидно, если бы вы использовали целые числа без знака, потому что тогда значение True
является максимальным значением, а не -1. Например:
Dim value As UInt16 = CType(True, UInt16) ' 65535
Итак, реальный вопрос заключается в том, почему в мире VB.NET использует 16 бит для хранения одного битового значения. Настоящая причина - скорость. Да, он использует в 16 раз больше объема памяти, но процессор может выполнять 16-битные логические операции намного быстрее, чем он может выполнять однобитовые логические операции.
Причина, по которой -1
хранится как 1111111111111111
вместо 1000000000000001
, как и следовало ожидать (первый бит является знаковым битом, а остальное является нормальным значением), заключается в том, что он сохраняется как два-дополнение. Сохранение отрицательных чисел в качестве двух-дополнений означает, что арифметические операции намного проще для процессора.