В качестве фона для этого вопроса я написал тестовую программу, чтобы исследовать странное поведение, которое мы наблюдали в программе обмена сообщениями, над которой я работаю.У нас есть различные структуры, которые используют битовые флаги для хранения состояний сообщений, некоторые флаги используют символ, некоторые используют шорты.Утилита, которую мы должны выгрузить сообщения в плоские файлы, использовала char * для этих значений флага, чтобы извлечь настройки, поэтому я намеренно использовал другой указатель на flag2.
Когда эта программа работает в AIX UNIX6.1 Почему вывод:
2 установлено
4 установлено
8 установлено
16 установлено
64 установлено
Что произошло со значениями 1 и 32?
#include <stdio.h>
#define SET(x,y) y |= (x)
#define UNSET(x,y) y &= (~x)
int main ( int argc, char *argv[] )
{
unsigned char *g;
unsigned short *h;
unsigned long *i;
char flag1;
short flag2;
long flag3;
g = (char*) &flag2;
SET(1, flag2);
if ( 1 & *g )
printf("1 set\n");
UNSET(1, flag2);
SET(2, flag2);
if ( 2 & *g )
printf("2 set\n");
UNSET(2, flag2);
SET(4, flag2);
if ( 4 & *g )
printf("4 set\n");
UNSET(4, flag2);
SET(8, flag2);
if ( 8 & *g )
printf("8 set\n");
UNSET(8, flag2);
SET(16, flag2);
if ( 16 & *g )
printf("16 set\n");
UNSET(16, flag2);
SET(32, flag2);
if ( 32 & *g )
printf("32 set\n");
UNSET(32, flag2);
SET(64, flag2);
if ( 64 & *g )
printf("64 set\n");
UNSET(64, flag2);
return 0;
}