Способ округления числа до граничного числа байтов размера int

Следующий код округляет аргумент до числа байтов, ограниченного размером int.

  #define _INTSIZE(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))

На моей машине int составляет 4 байта, так что - поправьте меня, если я ошибаюсь - это должно быть то же самое, что искать следующее целое число, кратное 4 (на моей машине). Под следующим кратным 4 я подразумеваю, что число должно быть округлено до числа, кратного 4, если оно не кратно 4. Если оно уже кратно 4, его следует оставить в покое.

Я играл с этим кодом. Коротко и подробно: почему этот код работает? (может быть, это не так, но кажется, что он работает). те, которые я пробовал.


person user678392    schedule 18.11.2011    source источник
comment
изменение последнего бита на & ~(sizeof(int)) работает?   -  person BudgieInWA    schedule 18.11.2011


Ответы (2)


Код сначала добавляет три к числу.

Затем он обнуляет последние два бита, чтобы округлить до числа, кратного четырем. Так же, как вы можете округлить до ближайшего числа, кратного 100, заменив последние две цифры нулями.)

Если число уже кратно четырем, добавление к нему трех и затем округление до ближайшего числа, кратного четырем, оставляет его в покое, как хотелось бы. Если число на 1, 2 или 3 больше, чем кратное 4, добавление к нему 3 поднимает его выше следующего кратного 4, которое затем округляется в меньшую сторону точно по желанию.

person David Schwartz    schedule 18.11.2011

На самом деле в этом есть тонкий баг. '& ~(sizeof(int) - 1)' работает, только если sizeof(int) является степенью двойки, существуют 36-битные и 80-битные архитектуры. если вы измените его на «% sizeof (int)», то он всегда будет правильным.

person John Meacham    schedule 07.11.2013