В.В. Кулямин - Технологии программирования. Компонентный подход (1134162), страница 45
Текст из файла (страница 45)
Нет никакихнеявных преобразований между логическими и целочисленными значениями. Над значениямиэтого типа определены следующие операции.•== и != — сравнения на равенство и неравенство.•! — отрицание.147•&& и || — условные (короткие) конъюнкция и дизъюнкция (‘и’ и ‘или’). Второй аргументэтих операций не вычисляется, если по значению первого уже ясно, чему равно значениевыражения, т.е., в случае конъюнкции — если первый аргумент равен false, а в случаедизъюнкции — если первый аргумент равен true. С помощью условного оператора ?: ихможно записать так: (x && y) — ((x)?(y): false), (x || y) — ((x)? true :(y)).Напомним, что означает условный оператор — выражение a?x:y вычисляет значение a,если оно true, то вычисляется и возвращается значение x, иначе вычисляется ивозвращается значение y.•& и | — (длинные) конъюнкция и дизъюнкция (‘и’ и ‘или’).
У этих операций обааргумента вычисляются всегда.•^ — исключающее ‘или’ или сумма по модулю 2.•Для операций &, |, ^ имеются соответствующие операторы присваивания &=, |=, ^=.Выражение x op= y, где op — одна из операций &, |, ^, имеет тот же эффект, что ивыражение x = ((x) op (y)), за исключением того, что значение x вычисляется ровноодин раз.Целочисленные типыВ обоих языках имеются следующие целочисленные типы.• Тип байтовых целых чисел, называемый в Java byte, а в C# — sbyte. Его значения лежатмежду -27 и (27-1) (т.е.
между -128 и 127)• short, чьи значения лежат в интервале -215 – (215-1) (-32768 – 32767)31•int, чьи значения лежат в интервале -2•long, чьи значения лежат в интервале -2– (231-1) (-2147483648 – 2147483647)63– (263-1) (-9223372036854775808 –9223372036854775807)Классы-обертки целочисленных типовназываются так:В C# имеются беззнаковые аналоги всехперечисленных выше типов:свой тип byte со значениями от 0 до (28-1 =255).16ushort со значениями от 0 до (2 -1) = 6553532uint со значениями от 0 до (2 -1) = 429496729564ulong со значениями от 0 до (2 -1) =18446744073709551615Типы-обертки целочисленных типовназываются так:java.lang.Bytejava.lang.Shortjava.lang.Integerjava.lang.LongSystem.SByteSystem.ByteSystem.Int16System.UInt16System.Int32System.UInt32System.Int64System.UInt64Минимальные и максимальные значенияпримитивных типов можно найти в их типахобертках в виде констант (static final полей)MIN_VALUE и MAX_VALUE.Минимальные и максимальные значенияпримитивных типов можно найти в их типахобертках в виде констант MinValue и MaxValue.Над значениями целочисленных типов определены следующие операции.•==, != — сравнение на равенство и неравенство.148•<, <=, >, >= — сравнение на основе порядка.•+, -, *, /, % — сложение, вычитание, умножение, целочисленное деление, взятиеостатка по модулю.•++, -- — увеличение и уменьшение на единицу.
Если такой оператор написан дооперанда, то значение всего выражения совпадает с измененным значением операнда, еслипосле — то с неизмененным.В результате выполнения последовательности действий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контексте. При этом создание исключения вовремя компиляции приводит к выдачесообщения об ошибке.Любые целочисленные типы можно явно приводить друг к другу, а неявные преобразованияпереводят из меньших типов в большие, если при этом нет перехода от типа со знаком кбеззнаковому (обратный переход возможен).149В обоих языках целочисленным типом считается и тип char, чьими значениями являются 16битные символы (от '\u0000' до '\uffff').
Для него определен тот же набор операций, нопреобразования между ним и другими типами по умолчанию не производятся (явныепреобразования возможны).Типы чисел с плавающей точкойПредставление типов значений с плавающей точкой, float и double, а также операции с ними,соответствуют стандарту на вычисления с плавающей точкой IEEE 754 (он же —IEC 60559) [11,12]. Согласно этому стандарту значение такого типа состоит из знакового бита,мантиссы и экспоненты (у значения float 23 бита отводятся на мантиссу и 8 на экспоненту, уdouble — 52 бита на мантиссу и 11 на экспоненту).Помимо обычных чисел значения обоих типов включают -0.0 (кстати, написав так, выполучите обычный 0.0, поскольку этот текст будет воспринят как константа 0.0, к которойприменен унарный оператор -; единственный способ получить -0.0 — конвертировать его битовоепредставление — в шестнадцатеричном виде для типа float он представляется как 0x80000000, адля double — 0x8000000000000000), положительные и отрицательные бесконечности (для типаfloat это 0x7f800000 и 0xff800000, а для double — 0x7ff0000000000000 и 0xfff0000000000000),а также специальное значение NaN (Not-A-Number, не число; оно может быть представлено любымизначениями, у которых экспонента максимальна, а мантисса не равна 0).Для значений с плавающей точкой определены следующие операции.•==, != — сравнения на равенство и неравенство.
В соответствии с IEEE 754 NaN не равнони одному числу, в том числе самому себе. -0.0 считается равным 0.0.•<, <=, >, >= — сравнения на основе порядка. +∞ больше, чем любой обычное число и -∞,а -∞ меньше любого конечного числа.
NaN несравнимо ни с одним числом, даже с самимсобой — это значит, что любая указанная операция возвращает false, если один из ееоперандов — NaN. -0.0 считается равным, а не меньше, чем 0.0.•+, -, *, /, % — сложения, вычитание, умножение, деление, взятие остатка по модулю, атакже соответствующие операции присваивания с одновременным выполнением одного изэтих действий. Все эти операции действуют согласно IEEE 754, кроме операциивычисления остатка, которая реализована так, чтобы при всех конечных a и b (b != 0)выполнялось a%b == a – b*n, где n — самое большое по абсолютной величине целоечисло, не превосходящее |a/b|, знак которого совпадает со знаком a/b.
По абсолютнойвеличине a%b всегда меньше b, знак a%b совпадает со знаком a.Согласно стандарту IEEE 754 все арифметические операции определены для бесконечныхаргументов «естественным» образом: 1.0/0.0 дает +∞, -1.0/0.0 дает -∞, 0.0/0.0 — NaN,конечное x в сумме с +∞ дает +∞, а +∞+(-∞) — NaN. Если один из операндов NaN, торезультат операции тоже NaN.•++, -- — увеличение и уменьшение на единицу.
Для бесконечностей и NaN результатприменения этих операторов совпадает с операндом.В Java в классах java.lang.Float иjava.lang.Double есть константы, равныемаксимальному конечному значению типа,минимальному положительному значению типа,положительной и отрицательнойбесконечностям и NaN.-23127Float.MAX_VALUE = (2-2 )·2-149Float.MIN_VALUE = 2-591023Double.MAX_VALUE = (2-2 )·2-1074Double.MIN_VALUE = 2Бесконечности и NaN в обоих случаяхВ C# соответствующие классы System.Single иSystem.Double также хранят эти значения ввиде констант MaxValue, Epsilon,PositiveInfinity, NegativeInfinity и NaN.150называются POSITIVE_INFINITY,NEGATIVE_INFINITY и NaN.В C# есть еще один тип для представлениячисел с плавающей точкой — decimal (типобертка для него называется System.Decimal).Значения этого типа представляются 128битами, из которых один используется длязнака, 96 — для двоичной мантиссы, еще 5 —для представления десятичной экспоненты,лежащей от 0 до 28. Остальные биты неиспользуются.Представляемое знаком s (+1 или -1), мантиссойm (0–(296-1)) и экспонентой e (0–28) значениеравно (-1)s·m·10-e.Таким образом, значения этого типа могут, вотличие от стандартных типов float и double,представлять десятичные дроби с 28-ю точнымизнаками и используются для финансовыхвычислений.