Способ округления числа до целого числа байтов
Следующий код округляет аргумент до граничного числа байтов.
#define _INTSIZE(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))
На моей машине int равно 4 байта, поэтому - поправьте меня, если я ошибаюсь - это должно быть то же самое, что и поиск следующего кратного 4 целого числа (на моей машине). Под следующим кратным 4 я подразумеваю, что число должно быть округлено до кратного 4, если не кратно 4. Если оно уже кратно 4, его следует оставить в покое.
Я играл с этим кодом. Короче говоря, почему этот код работает? (Возможно, это не так, но, похоже, это так.) Мне хотелось бы подумать, почему это будет работать для ВСЕХ случаев, а не только для тех, которые я опробовал.
2 ответа
Код сначала добавляет три к числу.
Затем он обнуляет последние два бита, чтобы округлить до кратных четырех. Точно так же, как вы можете округлить до ближайшего кратного 100 десятичного числа, заменив две последние цифры нулями.)
Если число уже кратно четырем, добавление к нему трех, а затем округление до ближайшего кратного четырем оставляет его одним, по желанию. Если число на 1, 2 или 3 больше, чем кратное 4, добавление 3 к нему поднимает его выше следующего кратного 4, к которому оно затем округляется, точно так, как требуется.
В этом есть небольшая ошибка. '& ~(sizeof(int) - 1)' работает только в том случае, если sizeof (int) является степенью двух-, 36-битной и 80-битной архитектуры, среди прочих существуют. если вы измените его на "% sizeof(int)", то оно всегда будет правильным.