typedef signed short s16;
typedef unsigned short u16;
typedef signed int s32;
typedef unsigned int u32;
typedef signed long long s64;
typedef unsigned long long u64;
Знак типа данных char
В стандарте языка С сказано, что тип данных char
char
использовать по умолчанию, лежит на компиляторе, препроцессоре или на обоих.Для большинства аппаратных платформ тип char
char
по умолчанию без знака, а возможные значения данных этого типа лежат в диапазоне от 0 до 255.Например, для систем, на которых тип char
i
числа 255 вместо -1.char i = -1;
На других машинах, где тип char
signed char i = -1;
Если в вашем коде используется тип данных char
signed char
, так и unsigned char
. Если необходим строго определенный вариант, то это нужно явно декларировать.Выравнивание данных
Выравнивание (alignment) соответствует размещению порции данных в памяти. Говорят, что переменная имеет
Для некоторых аппаратных платформ существуют строгие требования относительно выравнивания данных. На некоторых системах, обычно RISC, загрузка неправильно выровненных данных приводит к генерации системного прерывания (trap), ошибки, которую можно обработать. На других системах с неестественно выравниваемыми данными можно работать, но это приводит к уменьшению производительности. При написании переносимого кода необходимо предотвращать проблемы, связанные с выравниванием, а данные всех типов должны иметь естественное выравнивание.
Как избежать проблем с выравниванием
Компилятор обычно предотвращает проблемы, связанные с выравниванием, путем естественного выравнивания всех типов данных. На самом деле, разработчики ядра обычно не должны заниматься проблемами, связанными с выравниванием, об этом должны заботиться разработчики компилятора gcc. Однако такие проблемы все же могут возникать, когда разработчику приходится выполнять операции с указателями и осуществлять доступ к данным, не учитывая того, как компилятор выполняет операции доступа к данным.
Доступ к адресу памяти, для которого выполнено выравнивание, через преобразованный указатель на тип данных большего размера может привести к проблемам выравнивания (для разных аппаратных платформ это может проявляться по-разному). Следующий код может привести к указанной проблеме.
char dog[10];
char *p = &dog[1];
unsigned long l = *(unsigned long*)p;
В этом примере указатель на данные типа unsigned char
unsigned long
, что может привести к тому, что 32-разрядное значение типа unsigned long
будет считываться из памяти по адресу, не кратному четырем.Если вы думаете: "
Выравнивание нестандартных типов данных
Как уже указывалось, при выравнивании адрес стандартного типа данных должен быть кратным размеру этого типа. Нестандартные (сложные) типы данных подчиняются следующим правилам выравнивания.
• Выравнивание массива выполняется так же, как и выравнивание типа данных первого элемента (все остальные элементы будут корректно выровнены автоматически).
• Выравнивание объединения (union) соответствует выравниванию самого большого, по размеру, типа данных из тех, которые включены в объединение.
• Выравнивание структуры соответствует выравниванию самого большого, по размеру, типа данных среди типов всех полей структуры.