Компонентный подход в программировании

       

Целочисленные типы


В обоих языках имеются следующие целочисленные типы:

  • Тип байтовых целых чисел, называемый в Java byte, а в C# — sbyte. Его значения лежат между –27 и (27–1) (т.е. между –128 и 127)
  • short, чьи значения лежат в интервале -215 – (215-1) (-32768 – 32767)
  • int, чьи значения лежат в интервале -231 – (231-1) (-2147483648 – 2147483647)
  • long, чьи значения лежат в интервале -263 – (263-1) (-9223372036854775808 – 9223372036854775807)

В C# имеются беззнаковые аналоги всех перечисленных выше типов:

свой тип byte со значениями от 0 до (28–1 = 255).

ushort со значениями от 0 до (216–1) = 65535

uint со значениями от 0 до (232–1) = 4294967295

ulong со значениями от 0 до (264–1) = 18446744073709551615

Классы-обертки целочисленных типов называются так:

java.lang.Byte java.lang.Short java.lang.Integer java.lang.Long

Типы-обертки целочисленных типов называются так:

System.SByte System.Byte System.Int16 System.UInt16 System.Int32 System.UInt32 System.Int64 System.UInt64

Минимальные и максимальные значения примитивных типов можно найти в их типах-обертках в виде констант (static final полей) MIN_VALUE и MAX_VALUE.

Минимальные и максимальные значения примитивных типов можно найти в их типах-обертках в виде констант MinValue и MaxValue.

Над значениями целочисленных типов определены следующие операции:

  • ==, != — сравнение на равенство и неравенство.
  • <, <=, >, >= — сравнение на основе порядка.
  • +, -, *, /, % — сложение, вычитание, умножение, целочисленное деление, взятие остатка по модулю.
  • ++, -- — увеличение и уменьшение на единицу. Если такой оператор написан до операнда, то значение всего выражения совпадает с измененным значением операнда, если после — то с неизмененным.



    В результате выполнения последовательности действий

    x = 1; y = ++x; z = x++;

    значение x станет равно 3, а значения y и z — 2.

  • ~, &, |, ^ — побитовые операции дополнения, конъюнкции, дизъюнкции и исключающего ‘или’.
  • <<, >> — операторы, сдвигающие биты своего первого операнда влево и вправо на число позиций, равное второму операнду.




    В Java оператор >> сдвигает вправо биты числа, дополняя его слева значением знакового бита — нулем для положительных чисел и единицей для отрицательных.

    Специальный оператор >>> используется для сдвига вправо с заполнением освобождающихся слева битов нулями.


    В C# оператор >> сдвигает вправо биты числа, дополняя его слева для чисел со знаком значением знакового бита, а для беззнаковых чисел — нулем.
  • Для операций +, -, *, /, %, ~, &, |, ^, <<, >> (и Java-специфичной операции >>>) имеются соответствующие операции присваивания. При этом выражение x op= y, где op — одна из этих операций, эквивалентно выражению x = (T)((x) op (y)), где T — тип x, за исключением того, что значение x вычисляется ровно один раз.


В Java результаты арифметических действий вычисляются в зависимости от типа этих результатов, с отбрасыванием битов, "вылезающих" за размер типа.

Таким образом, эти операции реализуют арифметику по модулю 2n для n, подходящего для данного типа.

Арифметические операции над целыми числами приводят к созданию исключений только в трех случаях: при делении на 0 или вычислении остатка по модулю 0, при конвертации в примитивный тип ссылки на объект класса обертки, равной null, а также при исчерпании доступной Java-машине памяти, которое может случиться из-за применения операций -- и ++ с одновременным созданием объектов классов-оберток.


В C# результат арифметических действий над целочисленными данными, приводящих к переполнению, зависит от контекста, в котором эти действия производятся.

Если действие происходит в unchecked контексте (т.е. внутри блока или выражения, помеченных ключевым словом unchecked), то вычисления производятся в арифметике по подходящему модулю 2n.

Если же эти действия производятся в checked контексте (т.е. внутри блока или выражения, помеченных модификатором checked), то переполнение приводит к созданию исключения.

По умолчанию действия, производимые в ходе выполнения, происходят в unchecked контексте, а действия, которые выполняются над константами во время компиляции — в checked контексте. При этом создание исключения во время компиляции приводит к выдаче сообщения об ошибке.
Любые целочисленные типы можно явно приводить друг к другу, а неявные преобразования переводят из меньших типов в большие, если при этом нет перехода от типа со знаком к беззнаковому (обратный переход возможен).

В обоих языках целочисленным типом считается и тип char, чьими значениями являются 16-битные символы (от '\u0000' до '\uffff'). Для него определен тот же набор операций, но преобразования между ним и другими типами по умолчанию не производятся (явные преобразования возможны).


Содержание раздела