2009-11-05 2 views
0
size = (size_in_bytes + sizeof(int) - 1)/sizeof(int); 

Это скорее математические вопросы, чем реальный вопрос программирования ... Это потому, что C всегда округляется вниз?Почему следующее уравнение всегда округляется?

+2

Jonathan, добавьте комментарии, если вы думаете, что есть обман, не редактируйте сообщение OP. Грубо менять намерение OP, добавляя что-то подобное, и если он фактически закрыт для обмана, он будет добавлен автоматически. – bdonlan

+0

(@bdonlan - Я согласен с тобой, но право Джонатана - это обман, но у оригинала много макияжа.) –

+0

Ответ Тони Пони был принят первоначально, а затем неприемлемым. – 2009-11-05 07:24:24

ответ

6

Целое подразделение усекает в 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

раунд в направлении 0 значения .5 или больше => округлить 0 до .49999999 раунд вниз? – user133466

+1

раунд в направлении 0 означает, что [0, 1) переходит в 0. Для Например, 19/5 == 3. Он вообще не использует округление середины. –

+0

Округление к нулю означает, что отрицательные числа округлены ** вверх **: '-1/2 = 0' (не' -1'). –

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). Поэтому он всегда округляется.

+0

О нет, я ответил на вопрос меташока, не осознавая этого. – 2009-11-05 07:11:22

+0

@ Kino - Я понимаю ваши разочарования, но это может быть немного скупо. Если вас это беспокоит, возможно, сообщение в Meta в порядке. –

+0

Серьезно, я отправил этот ответ, не заметив, кто задал вопрос. В противном случае я бы не ответил на это. – 2009-11-05 07:18:26

1

Когда все аргументы INT, оператор/делает целочисленное деление. Это означает, что он разделит верх над дном, как и следовало ожидать от математики, но он просто выбросит остаток. Или, другими словами, он всегда будет округлен до нуля.

С целым делением (sizeof(int) - 1)/sizeof(int) всегда будет меньше одного. Это, по сути, самое большое не совсем одно значение, которое вы можете иметь. Поэтому добавление его к уравнению всегда добавит не совсем один к окончательному ответу, который при округлении вниз будет таким же, как округление исходного уравнения вверх.

Прочитав этот ответ, я понимаю, что в моей голове гораздо больше смысла, чем в словах.

+0

Педантичный nitpick: в C89/90 целочисленном делении, округленном до 0 или отрицательной бесконечности (поведение, определяющее реализацию). C++ 98 тот же (с добавленной рекомендацией округлить до 0). И только C99 обязал округлить до нуля во всех случаях. – AnT

Смежные вопросы