Список ошибок часто определяю так:
enum {ERR_1 = 1, ERR_2, ERR_3, ERR_n}; //ну или от 0
А уж возврат ошибочного значения из функции тогда или:
return ERR_...;
или:
return -ERR_...;
А если нужно возвращать из функции или данный код ошибки или корректное состояние, заданное тоже enum-ом, то делаю иногда так:
enum {OK_0, OK_1, OK_2, OK_n};
return (int)OK_1; //корректное завершение с кодом OK_1
return (int)OK_n + (int)ERR_1 - 1; //завершение с ошибкой ERR_1
Т.е. - возвращаются всегда положительные значения. Для Thumb2 такой способ оптимальнее.

Кто знает асм - поймёт.
Цитата(k155la3 @ May 25 2017, 12:35)

Оставшиеся 12 разрядов можно использовать для любой полезной инф - битовые флаги, поля итд. Фактически - структура.
Если нужно вернуть 2 параметра, то лучше и возвращать их как 2, а не лепить из них одно в точке return, и не распаковывать потом в точке вызова.
Если мне нужно например на 32-битной архитектуре вернуть 2 значения из функции, я делаю так:
u64 FuncA() {
u64 q = (u32)val1 | (u64)(u32)val2 << 32;
return q;
}
Если пытаться всё лепить в одно 32-битное значение, то будет куча лишних команд при упаковке и потом - при распаковке. А в вышеприведённом случае - минимум команд.