No Image

Язык си остаток от деления

СОДЕРЖАНИЕ
2 просмотров
22 января 2020

Пожалуйста, приостановите работу AdBlock на этом сайте.

Программы работают с данными. Зачастую данные представляют собой числа. В этом уроке, как вы наверное догадались, мы будем заниматься изучением того, как и что в языке Си можно делать с числами. Начнём с арифметики.

Компилятор языка Си понимает все основные арифметические операции, которые вам известны со школы. Плюс есть несколько дополнительных.

Основные арифметические операторы языка Си.

+ оператор сложения
— оператор вычитания
* оператор умножения
% оператор взятия остатка от деления
/ оператор деления

Следующая программа иллюстрирует использование первых четырёх из них. Кстати, обратите внимание на то, как с помощью функции printf вывести на экран символ % .

Результат работы этой программы представлен на следующем рисунке.

Рис.5 Использование арифметических действий в Си.

Всё чётко и понятно. Никаких неожиданностей. А теперь попробуем получить частное двух чисел. Т.к. результат должен получиться 3.5, то res объявим как float .

Как видите, результат получился не тот, что мы ожидали. Это одна из особенностей оператора деления в языке Си.

При делении значение целого типа на значение целого типа результат тоже получается целого типа.

Так уж устроен язык Си. Поэкспериментируйте, попробуйте любые другие целые числа.

Вычислить результат целочисленного деления легко. Поделите числа и отбросьте всё, что получилось в дробной части.

Пример: Как получить результат целочисленного деления

7/2 = 3.5 → 3
11/3 = 3.66 → 3
2/5 = 0.4 → 0

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

Посмотрим на нашем примере:

Теперь результат будет тот, что мы ожидали. Проделанный нами трюк называется явным преобразованием типа .

Явное преобразование (приведение) типа.

Если какое-то значение нужно привести к другому типу, нужно перед этим значением в скобках написать название требуемого типа.

Листинг 4. Примеры явного преобразования типа

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

Обратите внимание, что, когда мы преобразовываем целое значение в вещественное, ничего особенного не происходит, т.к. вещественные числа включают в себя целые.

Совсем иная ситуация, когда мы от вещественного переходим к целому. При этом переходе у нас теряется вся дробная часть. Не забывайте об этом.

Картинка, показывающая различия между операциями взятие остатка, целочисленного деления и обычного деления.

Рис.2 Деление, целочисленное деление и остаток от деления.

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Исследовательские задачи для хакеров

  1. Подумайте и приведите примеры, когда обычное деление не имеет смысла. Например, деление трёх лицензионных ключей от программы между двумя людьми. Зачем кому-то нужна половина лицензионного ключа? (если, конечно, он не занимается reverse engineering).
  2. Что происходит при делении на ноль в вашей системе?

Над объектами в языке Си могут выполняться различные операции:

  • операции присваивания;
  • операции отношения;
  • арифметические;
  • логические;
  • сдвиговые операции.

Результатом выполнения операции является число.

Операции могут быть бинарными или унарными.
Бинарные операции выполняются над двумя объектами, унарные — над одним.

Операция присваивания

Операция присваивания обозначается символом = и выполняется в 2 этапа:

  • вычисляется выражение в правой части;
  • результат присваивается операнду, стоящему в левой части:

объект = выражение;

В случае если объекты в левой и правой части операции присваивания имеют разные типы используется операция явного приведения типа.
объект = (тип)выражение;

Операции отношения

Основные операции отношения:

  • == эквивалентно — проверка на равенство;
  • != не равно — проверка на неравенство;
  • меньше;
  • > больше;
  • меньше или равно;
  • >= больше или равно.

Операции отношения используются при организации условий и ветвлений. Результатом этих операций является 1 бит, значение которого равно 1 , если результат выполнения операции — истина, и равно 0 , если результат выполнения операции — ложь.

Арифметические операции

Основные бинарные операции, расположенные в порядке уменьшения приоритета:

  • * — умножение;
  • / — деление;
  • + — сложение;
  • — вычитание;
  • % — остаток от целочисленного деления.

Основные унарные операции:

  • ++ — инкрементирование (увеличение на 1);
  • –– — декрементирование (уменьшение на 1);
  • — изменение знака.

Результат вычисления выражения, содержащего операции инкрементирования или декрементирования, зависит от того, где расположен знак операции (до объекта или после него). Если операция расположена до объекта, то сначала происходит изменение значения переменной на 1, а потом это значение используется для выполнения следующих операций. Если операция ++ или расположена после переменной, то сначала выполняется операция, а потом значение переменной изменяется на 1.

Бинарные арифметические операции могут быть объединены с операцией присваивания:

  • объект *= выражение; // объект = объект * выражение
  • объект /= выражение; // объект = объект / выражение
  • объект += выражение; // объект = объект + выражение
  • объект -= выражение; // объект = объект — выражение
  • объект %= выражение; // объект = объект % выражение

Логические операции

Логические операции делятся на две группы:

Условные логические операции чаще всего используются в операциях проверки условия if и могут выполняться над любыми объектами. Результат условной логической операции:

  • 1 если выражение истинно;
  • 0 если выражение ложно.

Вообще, все значения, отличные от нуля, интерпретируются условными логическими операциями как истинные.

Основные условные логические операции:

  • && — И (бинарная) — требуется одновременное выполнение всех операций отношения;
  • || — ИЛИ (бинарная) — требуется выполнение хотя бы одной операции отношения;
  • ! — НЕ (унарная) — требуется невыполнение операции отношения.

Побитовые логические операции оперируют с битами, каждый из которых может принимать только два значения: 0 или 1.

Основные побитовые логические операции в языке Си:

Читайте также:  Чем почистить подошву утюга филипс

инверсия (логическое НЕ) — унарная операция, результат которой равен 0 если операнд единичный, и равен 1, если операнд нулевой;

  • ^ исключающее ИЛИ — бинарная операция, результат которой равен 1, если только один из двух операндов равен 1 (в общем случае если во входном наборе операндов нечетное число единиц).
  • Для каждого бита результат выполнения операции будет получен в соответствии с таблицей.

    a

    a b a & b a | b a ^ b
    1
    1 1 1 1
    1 1 1
    1 1 1 1

    a; // e = 241 = 1111 0001
    f = a ^ b; // f = 7 = 0000 0111

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

    Бит Маска
    0x01
    1 0x02
    2 0x04
    3 0x08
    4 0x10
    5 0x20
    6 0x40
    7 0x80

    Для установки определенного бита необходимо соответствующий бит маски установить в 1 и произвести операцию побитового логического ИЛИ с константой, представляющей собой маску:

    Для сброса определенного бита необходимо соответствующий бит маски сбросить в 0 и произвести операцию побитового логического И с константой, представляющей собой инверсную маску:

    0x02); // a = 1, бит 1 сброшен

    Бинарные побитовые логические операции могут быть объединены с операцией присваивания:

    • объект &= выражение; // объект = объект & выражение
    • объект |= выражение; // объект = объект | выражение
    • объект ^= выражение; // объект = объект ^ выражение

    Сдвиговые операции

    Операции арифметического сдвига применяются в целочисленной арифметике и обозначаются как:

    • >> — сдвиг вправо;
    • — сдвиг влево.

    Общий синтаксис осуществления операции сдвига:
    объект = выражение сдвиг КоличествоРазрядов;

    Арифметический сдвиг целого числа вправо >> на 1 разряд соответствует делению числа на 2.
    Арифметический сдвиг целого числа влево на 1 разряд соответствует умножению числа на 2.

    Следующие операторы выполняют арифметические операции с операндами числовых типов: The following operators perform arithmetic operations with operands of numeric types:

    Эти операторы поддерживаются всеми целочисленными типами и типами с плавающей запятой. Those operators are supported by all integral and floating-point numeric types.

    Оператор инкремента ++ Increment operator ++

    Оператор инкремента ++ увеличивает операнд на 1. The unary increment operator ++ increments its operand by 1. Операндом должна быть переменная, свойство или индексатор. The operand must be a variable, a property access, or an indexer access.

    Оператор инкремента поддерживается в двух формах: постфиксный оператор инкремента ( x++ ) и префиксный оператор инкремента ( ++x ). The increment operator is supported in two forms: the postfix increment operator, x++ , and the prefix increment operator, ++x .

    Постфиксный оператор приращения Postfix increment operator

    Результатом x++ является значение x перед выполнением операции, как показано в следующем примере: The result of x++ is the value of x before the operation, as the following example shows:

    Префиксный оператор инкремента Prefix increment operator

    Результатом ++x является значение x после выполнения операции, как показано в следующем примере: The result of ++x is the value of x after the operation, as the following example shows:

    Оператор декремента — Decrement operator —

    Унарный оператор декремента — уменьшает операнд на 1. The unary decrement operator — decrements its operand by 1. Операндом должна быть переменная, свойство или индексатор. The operand must be a variable, a property access, or an indexer access.

    Оператор декремента поддерживается в двух формах: постфиксный оператор декремента ( x— ) и префиксный оператор декремента ( —x ). The decrement operator is supported in two forms: the postfix decrement operator, x— , and the prefix decrement operator, —x .

    Постфиксный оператор уменьшения Postfix decrement operator

    Результатом x— является значение x перед выполнением операции, как показано в следующем примере: The result of x— is the value of x before the operation, as the following example shows:

    Префиксный оператор декремента Prefix decrement operator

    Результатом —x является значение x после выполнения операции, как показано в следующем примере: The result of —x is the value of x after the operation, as the following example shows:

    Операторы унарного плюса и минуса Unary plus and minus operators

    Унарный оператор + возвращает значение полученного операнда. The unary + operator returns the value of its operand. Унарный оператор — изменяет знак операнда на противоположный. The unary — operator computes the numeric negation of its operand.

    Тип ulong не поддерживает унарный оператор — . The ulong type doesn’t support the unary — operator.

    Оператор умножения * Multiplication operator *

    Оператор умножения * вычисляет произведение операндов: The multiplication operator * computes the product of its operands:

    Унарный оператор * представляет собой оператор косвенного обращения к указателю. The unary * operator is the pointer indirection operator.

    Оператор деления / Division operator /

    Оператор деления / делит левый операнд на правый. The division operator / divides its left-hand operand by its right-hand operand.

    Деление целых чисел Integer division

    Для операндов цельночисленных типов результат оператора / является целочисленным типом, который равен частному двух операндов, округленному в сторону нуля: For the operands of integer types, the result of the / operator is of an integer type and equals the quotient of the two operands rounded towards zero:

    Чтобы получить частное двух операндов в виде числа с плавающей запятой, используйте тип float , double или decimal : To obtain the quotient of the two operands as a floating-point number, use the float , double , or decimal type:

    Деление чисел с плавающей запятой Floating-point division

    Для типов float , double и decimal результатом оператора / является частное двух операндов: For the float , double , and decimal types, the result of the / operator is the quotient of the two operands:

    Если один из операндов — это decimal , второй операнд не может быть ни float , ни double , так как ни float , ни double не преобразуется неявно в тип decimal . If one of the operands is decimal , another operand can be neither float nor double , because neither float nor double is implicitly convertible to decimal . Необходимо явным образом преобразовать операнд float или double в тип decimal . You must explicitly convert the float or double operand to the decimal type. Дополнительные сведения о числовых преобразованиях см. в разделе Встроенные числовые преобразования. For more information about conversions between numeric types, see Built-in numeric conversions.

    Читайте также:  Что значит калибровка батареи

    Оператор остатка % Remainder operator %

    Оператор остатка % вычисляет остаток от деления левого операнда на правый. The remainder operator % computes the remainder after dividing its left-hand operand by its right-hand operand.

    Целочисленный остаток Integer remainder

    Для целочисленных операндов результатом a % b является значение, произведенное a — (a / b) * b . For the operands of integer types, the result of a % b is the value produced by a — (a / b) * b . Знак ненулевого остатка такой же, как и у левого операнда, как показано в следующем примере: The sign of the non-zero remainder is the same as that of the left-hand operand, as the following example shows:

    Используйте метод Math.DivRem для вычисления результатов как целочисленного деления, так и определения остатка. Use the Math.DivRem method to compute both integer division and remainder results.

    Остаток с плавающей запятой Floating-point remainder

    Для операндов типа float и double результатом x % y для конечных x и y будет значение z , так что: For the float and double operands, the result of x % y for the finite x and y is the value z such that

    • знак z , если отлично от нуля, совпадает со знаком x ; The sign of z , if non-zero, is the same as the sign of x .
    • абсолютное значение z является значением, произведенным |x| — n * |y| , где n — это наибольшее возможное целое число, которое меньше или равно |x| / |y| , а |x| и |y| являются абсолютными значениями x и y , соответственно. The absolute value of z is the value produced by |x| — n * |y| where n is the largest possible integer that is less than or equal to |x| / |y| and |x| and |y| are the absolute values of x and y , respectively.

    Этот метод вычисления остатка аналогичен тому, который использовался для целочисленных операндов, но отличается от спецификации IEEE 754. This method of computing the remainder is analogous to that used for integer operands, but different from the IEEE 754 specification. Если вам нужна операция вычисления остатка, которая соответствует спецификации IEEE 754, используйте метод Math.IEEERemainder. If you need the remainder operation that complies with the IEEE 754 specification, use the Math.IEEERemainder method.

    Сведения о поведение оператора % в случае неконечных операндов см. в разделе Оператор остатка спецификации языка C#. For information about the behavior of the % operator with non-finite operands, see the Remainder operator section of the C# language specification.

    Для операндов decimal оператор остатка % эквивалентен оператору остатка типа System.Decimal. For the decimal operands, the remainder operator % is equivalent to the remainder operator of the System.Decimal type.

    В следующем примере показано поведение оператора остатка для операндов с плавающей запятой: The following example demonstrates the behavior of the remainder operator with floating-point operands:

    Оператор сложения + Addition operator +

    Оператор сложения + вычисляет сумму своих операндов: The addition operator + computes the sum of its operands:

    Кроме того, оператор + можно использовать для объединения строк и делегатов. You also can use the + operator for string concatenation and delegate combination. Дополнительные сведения см. в статье Операторы + и += . For more information, see the + and += operators article.

    Оператор вычитания — Subtraction operator —

    Оператор вычитания — вычитает правый операнд из левого: The subtraction operator — subtracts its right-hand operand from its left-hand operand:

    Кроме того, оператор — можно использовать для удаления делегатов. You also can use the — operator for delegate removal. Дополнительные сведения см. в статье Операторы — и -= . For more information, see the — and -= operators article.

    Составное присваивание Compound assignment

    Для бинарного оператора op выражение составного присваивания в форме For a binary operator op , a compound assignment expression of the form

    эквивалентно is equivalent to

    за исключением того, что x вычисляется только один раз. except that x is only evaluated once.

    Следующий пример иллюстрирует использование составного присваивания с арифметическими операторами: The following example demonstrates the usage of compound assignment with arithmetic operators:

    Из-за восходящих приведений результат операции op может быть невозможно неявно преобразовать в тип T из x . Because of numeric promotions, the result of the op operation might be not implicitly convertible to the type T of x . В этом случае, если op является предопределенным оператором, и результат операции является явно преобразуемым в тип T x , выражение составного присваивания формы x op= y эквивалентно x = (T)(x op y) , за исключением того, что x вычисляется только один раз. In such a case, if op is a predefined operator and the result of the operation is explicitly convertible to the type T of x , a compound assignment expression of the form x op= y is equivalent to x = (T)(x op y) , except that x is only evaluated once. В следующем примере продемонстрировано такое поведение. The following example demonstrates that behavior:

    Вы также можете использовать операторы += и -= для подписки и отмены подписки на события соответственно. You also use the += and -= operators to subscribe to and unsubscribe from an event, respectively. Дополнительные сведения см. в разделе Практическое руководство. Подписка и отмена подписки на события. For more information, see How to: subscribe to and unsubscribe from events.

    Читайте также:  Фотошоп и корел разница

    Приоритет и ассоциативность операторов Operator precedence and associativity

    В следующем списке перечислены арифметические операторы в порядке убывания приоритета: The following list orders arithmetic operators starting from the highest precedence to the lowest:

    • Постфиксный инкремент x++ и декремент x— Postfix increment x++ and decrement x— operators
    • Префиксный инкремент ++x и декремент —x , унарные операторы + и — Prefix increment ++x and decrement —x and unary + and — operators
    • Мультипликативные операторы * , / , и % Multiplicative * , / , and % operators
    • Аддитивные операторы + и — Additive + and — operators

    Бинарные арифметические операторы имеют левую ассоциативность. Binary arithmetic operators are left-associative. То есть операторы с одинаковым приоритетом вычисляются в направлении слева направо. That is, operators with the same precedence level are evaluated from left to right.

    Порядок вычисления, определяемый приоритетом и ассоциативностью операторов, можно изменить с помощью скобок ( () ). Use parentheses, () , to change the order of evaluation imposed by operator precedence and associativity.

    Полный список операторов C#, упорядоченный по уровню приоритета, можно найти в разделе Приоритет операторов статьи Операторы C#. For the complete list of C# operators ordered by precedence level, see the Operator precedence section of the C# operators article.

    Арифметическое переполнение и деление на нуль Arithmetic overflow and division by zero

    Если результат арифметической операции выходит за пределы диапазона возможных конечных значений соответствующего числового типа, поведение арифметического оператора зависит от типа его операндов. When the result of an arithmetic operation is outside the range of possible finite values of the involved numeric type, the behavior of an arithmetic operator depends on the type of its operands.

    Целочисленное арифметическое переполнение Integer arithmetic overflow

    Деление целого числа на ноль всегда вызывает исключение DivideByZeroException. Integer division by zero always throws a DivideByZeroException.

    В случае целочисленного арифметического переполнения итоговое поведение определяется контекстом проверки переполнения, который может быть проверяемым или непроверяемым: In case of integer arithmetic overflow, an overflow checking context, which can be checked or unchecked, controls the resulting behavior:

    • Если в проверяемом контексте переполнение возникает в константном выражении, происходит ошибка времени компиляции. In a checked context, if overflow happens in a constant expression, a compile-time error occurs. В противном случае, если операция производится во время выполнения, возникает исключение OverflowException. Otherwise, when the operation is performed at run time, an OverflowException is thrown.
    • В непроверяемом контексте результат усекается путем удаления старших разрядов, которые не помещаются в целевой тип данных. In an unchecked context, the result is truncated by discarding any high-order bits that don’t fit in the destination type.

    Вместе с проверяемыми и непроверяемыми операторами вы можете использовать операторы checked и unchecked , чтобы управлять контекстом проверки переполнения, в котором вычисляется выражение: Along with the checked and unchecked statements, you can use the checked and unchecked operators to control the overflow checking context, in which an expression is evaluated:

    По умолчанию арифметические операции выполняются в непроверяемом контексте. By default, arithmetic operations occur in an unchecked context.

    Арифметическое переполнение с плавающей запятой Floating-point arithmetic overflow

    Арифметические операции с типами float и double никогда не вызывают исключение. Arithmetic operations with the float and double types never throw an exception. Результатом арифметических операций с этими типами может быть одно из специальных значений, представляющих бесконечность и объект, не являющийся числовым: The result of arithmetic operations with those types can be one of special values that represent infinity and not-a-number:

    Для операндов типа decimal арифметическое переполнение всегда вызывает исключение OverflowException, а деление на нуль всегда вызывает исключение DivideByZeroException. For the operands of the decimal type, arithmetic overflow always throws an OverflowException and division by zero always throws a DivideByZeroException.

    Ошибки округления Round-off errors

    Из-за общих ограничений, касающихся представления вещественных чисел в форме с плавающей запятой и арифметических операций с плавающей запятой, при вычислениях с использованием типов с плавающей запятой могут возникать ошибки округления. Because of general limitations of the floating-point representation of real numbers and floating-point arithmetic, round-off errors might occur in calculations with floating-point types. То есть полученный результат выражения может отличаться от ожидаемого математического результата. That is, the produced result of an expression might differ from the expected mathematical result. В следующем примере показано несколько таких случаев: The following example demonstrates several such cases:

    См. заметки в справочной документации по System.Double, System.Single и System.Decimal. For more information, see remarks at the System.Double, System.Single, or System.Decimal reference pages.

    Возможность перегрузки оператора Operator overloadability

    Определяемый пользователем тип может перегружать унарные ( ++ , — , + и — ) и бинарные ( * , / , % , + и — ) арифметические операторы. A user-defined type can overload the unary ( ++ , — , + , and — ) and binary ( * , / , % , + , and — ) arithmetic operators. При перегрузке бинарного оператора соответствующий оператор составного присваивания также неявно перегружается. When a binary operator is overloaded, the corresponding compound assignment operator is also implicitly overloaded. Определяемый пользователем тип не может перегружать оператор составного присваивания явным образом. A user-defined type cannot explicitly overload a compound assignment operator.

    Спецификация языка C# C# language specification

    Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#: For more information, see the following sections of the C# language specification:

    Комментировать
    2 просмотров
    Комментариев нет, будьте первым кто его оставит

    Это интересно
    No Image Компьютеры
    0 комментариев
    No Image Компьютеры
    0 комментариев
    No Image Компьютеры
    0 комментариев
    No Image Компьютеры
    0 комментариев
    Adblock detector