diff --git a/numeric/narrowing.md b/numeric/narrowing.md index 08a6ed3..5434181 100644 --- a/numeric/narrowing.md +++ b/numeric/narrowing.md @@ -31,7 +31,7 @@ int main() { В этом коде нет неопределенного поведение (по крайней мере на используемых входных данных). Но есть неявное приведение типов, делающее результат неожиданным. 1. Тип возвращаемого значения `std::accumulate` определяется третьим аргументом. В данном случае это целочисленный знаковый ноль — тип по умолчанию для всех числовых литералов. -2. Тип значения, возвращаемого оператором деления, определяется по правилам для [типичных арифметических преобразований](https://timsong-cpp.github.io/cppwp/n4950/expr.arith.conv) (usual arithmetic conversions). В этих правилах участвует понятие [ранга преобразования](https://timsong-cpp.github.io/cppwp/n4950/conv.rank) (conversion rank). Он определен для любого целочисленного типа. Ранг `size_t` выше, чем `int`, поэтому он будет выбран в качестве типа результата деления. +2. Тип возвращаемого значения операции деления определяется наибольшим из участвующих типов аргументов, а также правилами для [типичных арифметических преобразований](https://timsong-cpp.github.io/cppwp/n4950/expr.arith.conv) (usual arithmetic conversions). В примере тип левого аргумента — `int`, а правого — `size_t`. Это достаточно широкое беззнаковое целое, более широкое, чем `int`. Поэтому он будет выбран в качестве типа результата деления. 3. `-3` неявно преобразуется к типу `size_t` — такое преобразование вполне определено. Результатом будет беззнаковое число `2^N - 3`. Здесь `N` — количество бит, отводимых под тип `size_t`. 4. Далее будет произведено деление беззнаковых чисел. `(2^N - 3) / 3`. Старший бит результата окажется нулевым. 5. Возвращаемым типом функции `average` объявлен `int`. Так что нужно выполнить еще одно неявное преобразование.