Получать сам массив сырых байтов не надо. Надо только проверить условие на значение его элементов, которые они приняли бы, если такой массив всё таки из числа получить.
Ты сам-то понимаешь, что пишешь? Если разрядность байта будет недостаточна для представления числа, то задача вообще становится некорректной, так как в условии сказано, что мы должны разобрать число побайтно.
Дано число типа uint16_t, равное 273. Докажи, что его нельзя разобрать на два байта. Речь о другом.
1. Нельзя гарантировать, что в будущем не будет реализован в каком нибудь компиляторе тип беззнаковых целых, разрядность которого будет больше 256-ти.
2. Длинная двоичная арифметика фиксированной разрядности также может иметь разрядность хоть 1024 байта.
Поэтому если я не напишу ограничение на разрядность сверху, то тут же получаем вывод о том, что задача в общем случае не решаема, так как если разрядность больше 256-ти, то байтов в числе тоже больше 256-ти, то есть как минимум 257. Разобрать то его на байты можно всё равно, но если байтов 257, или больше, то они:
1. Вообще не могут принимать все значения от 0 до sizeof(x)-1, так как sizeif(x)-1 не лезет в байт.
2. Не могут принимать все значения ровно по разу, так как байтов больше, чем возможных вариантов их значений.
А так получаем, что не зависимо от того, как будет меняться стандарт, развиваться процессоры и кому взбредёт в голову встроить в диалект длинно-арифметическую отсебятину, в версиях обсуждаемой функции такой тип поддерживать не надо.
1. sizeof(x)<256.
2. Тип реализован. Как именно, является ли он стандартным или отсебячьим, встроен ли в диалект, или это отсебятина уже прикладника, значения не имеет. Он реализован и поддерживает все стандартные операции над беззнаковыми целыми.
3. Разрядность фиксирована.
4. Даже если это класс, данные хранятся непосредственно в его членах, а указателей он не содержит.
5. Размер байта достаточен для представления sizeof(x)-1.
Нужны версии функции только для типов, удовлетворяющих всем пяти условиям. То есть если кому то взбредёт сократить байт до четырёх бит, то на такой платформе требуется поддерживать уже типы не более 16-ти байт. А при духбитном байте не более 4-х. Платформы с адресацией каждого бита не рассматриваем вообще.
И даже если условие будет изменено, то в моей программе только поменяется тип элементов входного массива с unsigned char на unsigned short, а тебе же твою программу переписать с нуля придётся... И ты после этого о переносимости своего кода заикаешься?
0x100 заменить на 0x10000 - это нифига не переписывать с ноля. И откуда short появится?
Любая минимально адресуемая ячейка - это байт.
И так, господа, если число является встроенным типом, у нас есть гарантия, что оно располагается в памяти непрерывно.
Ни кто не гарантировал, что тип встроенный.
bool ContainsConsecutiveValues(const unsigned char arrNumbers[]
И за каждым вызовом таскать приведение типа (пусть и без фактического преобразования, но в тексте оно должно будет быть), да ещё и передачу sizeof. Это всё таки не библиотечная функция, чтоб так усложнять синтаксис. Ни где не сказано, что число
уже разобрано на байты. Оно только с "точки зрения" аппаратуры хранится в байтах, но синтаксически представляет из себя единую сущность - число. И при вызове должно использоваться именно число, а не указатель на его байты.