Как правильно извлечь числа из битового поля?
Правильно. Ведущие нули не нужны, просто 0xFF или 0xFFFF. Но можно проще:struct BitField{
    union{
        int value;
        struct{
            int a:8;
            int b:8;
            int c:16;
        };
    };
};

BitField MyBits;
MyBits.a = 4; //fill the internal bit structure
MyBits.b = 7;
MyBits.c = 5;
cout << MyBits.value; //print the full int representation
Вопрос "правильности" в первую очередь связан с диапазоном значений, которые могут принимать a, b и c.
Ваша запись будет работать для a и b от 0 до 255 и c от 0 до 32767.
С отрицательными значениями, в принципе, работать можно, но надо дополнять знак при обратном преобразовании, например так (a от -128 до 127)a = x & 0xFF;
if (a & 0x80) 
  a &= -1;