Целочисленные типы
В обоих языках имеются следующие целочисленные типы:
- Тип байтовых целых чисел, называемый в 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'). Для него определен тот же набор операций, но преобразования между ним и другими типами по умолчанию не производятся (явные преобразования возможны).