С целыми числами c ++ 1, деленное на 2, надежно равно 0, а 3/2 = 1, 5/2 = 2 и т. Д.?

Есть два вектора разных, но связанных размеров. Чем больше (2 * RESOLUTION) + INDEX_OFFSET (например, 2050) и меньший просто RESOLUTION (например, 1024). Я считаю, что достаточно безопасно предположить, что uint16_t может использоваться для содержания векторного индекса.

Итерация по большему вектору выполняется путем увеличения resultIndex на 2. Во время каждой итерации присваивается меньший вектор в индексе (resultIndex - INDEX_OFFSET) / 2,

По сути, код опирается на предположение, что, будь то INDEX_OFFSET Нечетное или четное, приведенное выше деление на 2 всегда будет округляться, независимо от архитектуры. Например, если resultIndex 0 или 1, то ожидается 0, если 2 или 3, то 1 ожидается, и так далее. Это безопасное предположение, в рамках параметров выше?

Нотабене Я признаю существование «Деление целочисленных типов — предсказуемы ли результаты?» но это не похоже на точное совпадение.

6

Решение

Да; это гарантируется языком:

[C++11: 5.6/4]: Бинарный / оператор дает частное, а двоичный % Оператор возвращает остаток от деления первого выражения на второе. Если второй операнд / или же % ноль, поведение не определено. Для интегральных операндов / оператор дает алгебраический фактор с любой отброшенной дробной частью; если частное a/b представимо в типе результата, (a/b)*b + a%b равно a,

В 3/2, и то и другое 3 а также 2 являются интегральными операндами; алгебраический фактор этой операции 1.5и когда вы отбрасываете дробную часть .5, ты получаешь 1, Это относится и к другим вашим примерам, а также ко всем остальным примерам.

15

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]