Ответ 1
Это битовые поля. В основном, число после двоеточия описывает количество бит, которое использует поле. Ниже приведена цитата из MSDN, описывающая битовые поля:
Константное выражение указывает ширину поля в битах. Тип-спецификатор для декларатора должен быть без знака int, подписанным int или int, а константное выражение должно быть неотрицательным целочисленным значением. Если значение равно нулю, декларация не имеет декларатора. Массивы бит поля, указатели на битовые поля и функции, возвращающие поля бит, являются не допускается. Необязательный declarator называет поле бит. Поля бит может быть объявлена только как часть структуры. Адрес-оператор (&) не может применяться к компонентам битового поля.
Неверные поля бита не могут быть указаны, а их содержимое при запуске время непредсказуемо. Они могут использоваться как поля "dummy", для выравнивание. Неименованное поле бит, ширина которого задается как 0 гарантирует, что хранение для члена, следующего за ним, в struct-declaration-list начинается с границы int.
В этом примере определяется двумерный массив структур с именем screen.
struct
{
unsigned short icon : 8;
unsigned short color : 4;
unsigned short underline : 1;
unsigned short blink : 1;
} screen[25][80];
Изменить: еще один важный бит из ссылки MSDN:
Бит-поля имеют ту же семантику, что и целочисленный тип. Это означает, что бит используется в выражениях точно так же, как переменная того же базового типа, независимо от того, сколько бит в поле бит.
Быстрый образец хорошо иллюстрирует это. Интересно, что со смешанными типами компилятор по умолчанию имеет значение sizeof (int)
.
struct
{
int a : 4;
int b : 13;
int c : 1;
} test1;
struct
{
short a : 4;
short b : 3;
} test2;
struct
{
char a : 4;
char b : 3;
} test3;
struct
{
char a : 4;
short b : 3;
} test4;
printf("test1: %d\ntest2: %d\ntest3: %d\ntest4: %d\n", sizeof(test1), sizeof(test2), sizeof(test3), sizeof(test4));
test1: 4
test2: 2
test3: 1
test4: 4