Приведение типов посредством побитовых операторов
Обновлен: Ноябрь 2007
Побитовые операторы данной версии JScript полностью совместимы с побитовыми операторами предыдущих версий JScript. Кроме того, операторы JScript можно также использовать для новых числовых типов данных. Поведение побитовых операторов зависит от двоичного представления данных, поэтому важно понимать, каким образом эти операторы выполняют приведение типов.
Побитовым оператором можно передавать данные трех типов: переменные с ранней привязкой, переменные с поздней привязкой и литеральные данные. Переменные с ранней привязкой — это переменные, определенные с помощью явной аннотации типа. Переменные с поздней привязкой — это переменные типа Object, содержащие числовые данные.
Операторы побитового И (&), побитового ИЛИ (|) и побитового исключающего ИЛИ (^)
Если один из операндов является переменной с поздней привязкой или оба операнда представляют собой литералы, то оба операнда приводятся к типу int (System.Int32) и выполняется операция, при этом возвращаемое значение принадлежит типу int.
Если оба операнда являются переменными с ранней привязкой или один из операндов является литералом, а другой — переменной с ранней привязкой, то выполняются дополнительные действия. Оба операнда приводятся к типу, определяемому двумя условиями, перечисленными ниже.
Если ни один из операндов не принадлежит к целочисленному типу, оба операнда приводятся к типу int.
Если только один из операндов принадлежит к целочисленному типу, операнд, не являющийся целым числом, приводится к целочисленному типу первого операнда или к типу int, в зависимости от того, какой тип является более длинным.
Если длины операндов не равны, то длина типа, к которому приводятся операнды, соответствует более длинному операнду.
Если один из операндов не имеет знака, тип, к которому приводится операнд, также не имеет знака. В противном случае приведение выполняется к типу со знаком.
После определения соответствующего типа выполняется приведение, осуществляется побитовая операция и возвращается результат. Результат принадлежит к типу, к которому приводятся операнды.
Если в побитовом операторе используется целочисленный литерал и переменная с ранней привязкой, литерал интерпретируется как тип int, long, ulong или double, в зависимости от того, какой наименьший тип может представить данное число. Литеральные значения типа decimal приводятся к типу double. Впоследствии к типу данных литерала может быть применено дальнейшее приведение в соответствии с правилами, описанными выше.
Оператор побитового НЕ (~)
Если операнд является переменной с поздней привязкой, значением с плавающей запятой или литералом, то он приводится к типу int (System.Int32) и выполняется операция НЕ; при этом возвращаемое значение принадлежит типу int.
Если операнд принадлежит целочисленному типу данных с ранней привязкой, то выполняется операция НЕ и тип возвращаемого значения совпадает с типом операнда.
Операторы побитового сдвига влево (<<) и побитового сдвига вправо (>>)
Если левый операнд является переменной с поздней привязкой, значением с плавающей запятой или литералом, то он приводится к типу int (System.Int32). В противном случае левый операнд принадлежит к целочисленному типу данных с ранней привязкой и приведение не выполняется. Правый операнд всегда приводится к целочисленному типу данных. Затем к приведенным значениям применяется операция сдвига, и возвращаемое значение принадлежит к типу левого операнда (если он является типом с ранней привязкой) или типу int.
Оператор сдвига вправо без знака (>>>)
Если операнд является переменной с поздней привязкой, значением с плавающей запятой или литералом, то он приводится к типу uint (System.UInt32). В противном случае левый операнд принадлежит к целочисленному типу данных с ранней привязкой и приводится к типу того же размера без знака. Например, тип int будет приведен к типу uint. Правый операнд всегда приводится к целочисленному типу данных. Затем к приведенным значениям применяется операция сдвига, и возвращаемое значение принадлежит к приведенному типу левого операнда (если он является типом с ранней привязкой) или типу uint.
Результат операции сдвига вправо без знака всегда достаточно мал, чтобы храниться в версии возвращаемого типа со знаком без переполнения.
См. также
Основные понятия
Приведение типов в языке JScript