Преобразование логического значения в байт в VB.NET - PullRequest
6 голосов
/ 09 февраля 2012

Почему приведение boolean к byte в .NET дает следующий вывод?

Фрагмент кода:

Dim x As Boolean = 1
Dim y As Byte = x    'Implicit conversion here from Boolean to Byte

System.Diagnostics.Debug.Print( _
    "x = " & x.ToString _
    & " y = " & y.ToString _
    & " (bool)(1) = " & CType(1, Boolean).ToString _
    & " (byte)((bool)1) = " & CType((CType(1, Boolean)), Byte).ToString)

Вывод:

x = True
y = 255
(bool) (1) = True
(byte) ((bool) 1) = 255

Почему True(которое обычно называется целочисленным представлением 1), преобразуется в 255 при преобразовании в byte?

Ответы [ 4 ]

12 голосов
/ 09 февраля 2012

Компилятор VB.NET обрабатывает это как сужающее преобразование.Из спецификации VB.NET версии 10.0:

Сужающиеся преобразования - это преобразования, которые не могут быть доказаны всегда успешными, преобразования, о которых известно, что они могут потерять информацию, и преобразования между доменами типов, достаточно отличающихся для сужения нотации.,Следующие преобразования классифицируются как сужающие преобразования:

  • От логического значения к байту, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single или Double.

С документы :

Когда Visual Basic преобразует значения числового типа данных в логическое значение, 0 становится ложным, а все остальные значения становятся истинными.Когда Visual Basic преобразует логические значения в числовые типы, False становится 0, а True становится -1.

Байты не подписаны, поэтому вместо Compliment Two вы получаете 255.1021 *

5 голосов
/ 09 февраля 2012

Логическое значение True в .NET сохраняется как -1, что, в свою очередь, равно 11111111 из-за дополнения до двух

То есть Dim x As Boolean = 1 преобразует 1 в логическое значение True

и Dim y As Byte = x преобразует True в 11111111, что равно 255

(Если вместо этого вы написали Dim z As Integer = x, z будет = -1)

3 голосов
/ 09 февраля 2012

Все исторические версии Basic, которые я видел, которые поддерживали побитовые логические операторы с целыми числами, использовали "набор всех битов", то есть -1, в качестве значения для истинных сравнений.Таким образом, если кто-то хочет иметь значение, равное 9, если a == b, или ноль, если нет, можно использовать выражение 9 AND (a=b).Хотя оператор ?:, присутствующий в C, позволяет более четко кодировать такое поведение, использование -1 для «true» имеет больше практических преимуществ, чем недостатков в языке без дискретного логического типа.

Хотя vb.net - это его собственный язык, совершенно отдельный от vb6, есть много кода, который был перенесен с vb6 на vb.net, и может полагаться на тот факт, что операторы сравнения выдают набор всех битов, когда оно истинно.

1 голос
/ 25 марта 2017

Если вы хотите преобразовать true в 1 и false в 0, используйте:

Convert.ToByte(Boolean) 

Ссылка на документацию Convert.ToByte (логическое значение) ,

В противном случае вы получите реальное значение -1, 0xFF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...