Я не уверен, что требуется, но вот правила арифметического преобразования целых чисел.
Если целое число назначено другому младшему биту, данные будут усечены.
Пример:
struct A {
int c1 : 8;
unsigned c2 : 8;
} a;
int main()
{
short int i = 255; // right 8 bits containing all bits set
a.c1 = i; // or a.c1 = 255. casting not required.
a.c2 = i; // same as above.
// prints -1, 255
printf("c1: %d c2: %d\n", a.c1, a.c2);
i = 511; // 9 number of 1 bits
a.c1 = i; // left 9th bit will be truncated. casting not required.
a.c2 = i; // same as above
// prints -1, 255
printf("c1: %d c2: %d\n", a.c1, a.c2);
return 0;
}
Если 8-разрядное целое число со знаком (или символ) назначено более высокому битовому целому числу (скажем, int), его знаковый бит будет сдвинут.
например:
char c = 255; // which is -1
int i = c; // i is now -1. sign bit will be shifted to 32nd bit.