Если вы объявляете source
типом unsigned char
, все должно работать. (Или uint8_t
, если вы хотите более четко указать размер, но uint8_t
не может существовать на платформах, где CHAR_BIT!=8
в любом случае.)
Один из возможных подводных камней - использование значения source+blah
в выражении без предварительной записи его обратно в переменную типа unsigned char
. В этом случае вполне может быть за пределами диапазона 0-255 из-за целочисленного продвижения. Если вам нужно это сделать, либо передайте результат сложения обратно unsigned char
, либо замаскируйте его с помощью &0xff
(или эквивалентно &255
).
Кстати, не слушайте людей, которые говорят вам использовать% вместо &. Если вы не очень осторожны, чтобы убедиться, что выражения, которые вы используете с%, имеют тип unsigned int
или больший тип без знака,% будет выполнять фактическую операцию деления / остатка, а не просто битовую маскировку. Люди все время путаются, думая, что компилятор будет оптимизировать% на степень 2, и не понимая, что оптимизация невозможна для подписанных типов.