【发布时间】:2011-02-05 18:30:36
【问题描述】:
作为这个问题的背景,这是我编写的一个测试程序,用于调查我们在我工作的消息传递程序中看到的一些奇怪行为。我们有各种使用位标志来保存消息状态的结构,一些标志使用 char,一些使用 short。我们必须将消息转储到平面文件的实用程序是在这些标志值上使用 char* 来提取设置,因此我故意在 flag2 上使用了不同的指针。
当这个程序在 AIX UNIX 6.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;
}
【问题讨论】:
-
您可能希望将
flag2显式初始化为 0。 -
flag2 很短,但您将指向它的指针转换为 char*,请改用 short*(g 也应该是 short 类型)。
-
我在 HP UX 上运行程序,它根本不打印任何东西,但是当我在 Fedora 上运行相同的程序时,它可以工作。
-
为什么要在 short 上使用 char 指针?
标签: c bit-manipulation