size = (size_in_bytes + sizeof(int) - 1)/sizeof(int);
Это скорее математические вопросы, чем реальный вопрос программирования ... Это потому, что C всегда округляется вниз?Почему следующее уравнение всегда округляется?
size = (size_in_bytes + sizeof(int) - 1)/sizeof(int);
Это скорее математические вопросы, чем реальный вопрос программирования ... Это потому, что C всегда округляется вниз?Почему следующее уравнение всегда округляется?
Целое подразделение усекает в C, да. (т. е. округляется до нуля, а не округляется вниз).
Добавив «делитель - 1», вы убедитесь, что любое число, которое не является точным кратным делителю, округляется. Так, например, деление на 3:
(0 + 2)/3 == 0 (0 is an exact multiple)
(1 + 2)/3 == 1 (round up)
(2 + 2)/3 == 1 (round up)
(3 + 2)/3 == 2 (3 is an exact multple)
т.д.
раунд в направлении 0 значения .5 или больше => округлить 0 до .49999999 раунд вниз? – user133466
раунд в направлении 0 означает, что [0, 1) переходит в 0. Для Например, 19/5 == 3. Он вообще не использует округление середины. –
Округление к нулю означает, что отрицательные числа округлены ** вверх **: '-1/2 = 0' (не' -1'). –
Если size_in_bytes
является целым числом, кратным sizeof(int)
, как 2 * sizeof(int)
, это дает вам, что мультипликатор, потому что (SizeOf (INT) -1)/SizeOf (INT) меньше, чем один. Если size_in_bytes
- это что-то иное, чем целое число, кратное sizeof(int)
, остаток при делении на sizeof(int)
должен быть как минимум один. Итак, (sizeof(int)
+ этот остаток - один) всегда> = sizeof (int). Поэтому он всегда округляется.
О нет, я ответил на вопрос меташока, не осознавая этого. – 2009-11-05 07:11:22
@ Kino - Я понимаю ваши разочарования, но это может быть немного скупо. Если вас это беспокоит, возможно, сообщение в Meta в порядке. –
Серьезно, я отправил этот ответ, не заметив, кто задал вопрос. В противном случае я бы не ответил на это. – 2009-11-05 07:18:26
Когда все аргументы INT, оператор/делает целочисленное деление. Это означает, что он разделит верх над дном, как и следовало ожидать от математики, но он просто выбросит остаток. Или, другими словами, он всегда будет округлен до нуля.
С целым делением (sizeof(int) - 1)/sizeof(int)
всегда будет меньше одного. Это, по сути, самое большое не совсем одно значение, которое вы можете иметь. Поэтому добавление его к уравнению всегда добавит не совсем один к окончательному ответу, который при округлении вниз будет таким же, как округление исходного уравнения вверх.
Прочитав этот ответ, я понимаю, что в моей голове гораздо больше смысла, чем в словах.
Педантичный nitpick: в C89/90 целочисленном делении, округленном до 0 или отрицательной бесконечности (поведение, определяющее реализацию). C++ 98 тот же (с добавленной рекомендацией округлить до 0). И только C99 обязал округлить до нуля во всех случаях. – AnT
Jonathan, добавьте комментарии, если вы думаете, что есть обман, не редактируйте сообщение OP. Грубо менять намерение OP, добавляя что-то подобное, и если он фактически закрыт для обмана, он будет добавлен автоматически. – bdonlan
(@bdonlan - Я согласен с тобой, но право Джонатана - это обман, но у оригинала много макияжа.) –
Ответ Тони Пони был принят первоначально, а затем неприемлемым. – 2009-11-05 07:24:24