Способ округления числа до целого числа байтов - PullRequest
1 голос
/ 18 ноября 2011

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 18 ноября 2011

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

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

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

2 голосов
/ 08 ноября 2013

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

...