Я хочу определить тип, равный массиву из 16 байт. Что-то вроде этого:
typedef uint8_t[16] mynewType;
но я получаю сообщение об ошибке. Как я могу определить такой тип?
Я получаю несколько ошибок в этой строке, например:
missing ';' before '['
empty attribute block is not allowed
missing ']' before 'constant'
'constant'
@Eljay Но это не гарантирует, что тип будет иметь ширину ровно 16 байт. Может быть заполнение или, если CHAR_BIT больше 8, то он также будет больше.
@NathanOliver "Оператор sizeof дает количество байтов, занятых не потенциально перекрывающимся объектом типа его операнда" и "sizeof (char), sizeof (подписанный char) и sizeof (unsigned char) равны 1", независимо от CHAR_BIT
@PasserBy Спасибо. По крайней мере, теперь я знаю, что бит CHAR_BIT - это байт.
@NathanOliver • одна странная платформа, над которой я работал, байт (или символ) был 13-битным. Слово (или int) было 26-битным.
@Eljay Интересно. Не могли бы вы рассказать, что это за платформа? Это широко используемая платформа или особая система?
Платформа - современный C++ (C++ 11 или новее). Широко используется современный C++.
@Eljay Я имею в виду платформу, у которой размер char равен 13 битам! Какой процессор его поддерживает?
лол, упс, я думал, вы имеете в виду другой комментарий. 13-битная платформа была создана как виртуальная машина профессором моего университета. Он мучил студентов, заставляя их использовать его 13-битную платформу для своих заданий, таких как создание компилятора / компоновщика или ассемблера, и студенты должны были получить тонну плохо написанной документации от Kinko's ($$$). Я думаю, он создал свою виртуальную машину в 1960-х годах, когда на одних машинах было 6-битных байтов, у других - 36-битных; на PDP-8 (12-битная машина). Дикие и мрачные времена.





Просто
typedef uint8_t mynewType [16];
Как переменная массива:
typedef uint8_t mynewType[16];
Typedef похож на объявление, но с дополнительным typedef впереди.
Так что если
uint8_t my_array[16];
объявляет новый массив.
typedef uint8_t my_array[16];
делает my_array типом такого массива.
typedef unsigned char mynewType [16];
- переносимый способ выделения 16 байтов на платформе любой; CHAR_BIT не обязательно должен быть 8 обязательно.
Это CHAR_BIT байт 8 или это всего 8 бит? Вы по-прежнему называете 16-битный символ байтом в системах такого типа?
В самом деле, я бы стал. Термин октет используется для описания ровно 8 бит.
Прохладный. Спасибо +1
Что вы думаете об этом сообщении в блоге? gustedt.wordpress.com/2010/06/01/how-many-bits-has-a-byte
@FredLarson: Это стандарт POSIX, который на момент написания не совпадает со стандартом C++. POSIX также утверждает, что определяемая пользователем переменная, оканчивающаяся на _t, переводит всю программу в неопределенное состояние!
За исключением того, что uint8_tи другие теперь являются частью C++ 11 и C99, а не только POSIX.
@FredLarson: Я не уверен в этом. Это вопрос сам по себе. Я буду следить за ним и проголосовать за него, если вы его поставите.
Возможно, я был неправ, читая более внимательно обсуждение комментариев здесь: stackoverflow.com/a/3200969/10077
@FredLarson: Хороший вопрос: внести изменения во весь мусор i++ + ++i, который мы получаем в наши дни.
Вы можете использовать структуру с полем массива такого размера. Но вам все равно нужно будет установить отдельные байтовые значения. Вы также можете использовать объединение, если хотите получить доступ к различным фрагментам памяти разными способами.
// simple data structure of 16 bytes
struct pack_16 {
uint8_t data[16];
}
// sizeof(pack_16) == 16
// multi type access of 16 bytes
union multi_pack_16 {
uint8_t uint_8[16];
uint16_t uint_16[8];
uint32_t uint_32[4];
uint64_t uint_64[2];
}
// sizeof(multi_pack_16) == 16
Кроме того, в зависимости от вашего компилятора может быть определен тип данных uint128_t размером 16 байт.
Мог сделать
using mynewType = struct { char data[16]; };. Это позволит избежать вырождения массива в указатель в мгновение ока.