C 位域中的整数表示

C 位域中的整数表示,c,visual-studio-2008,C,Visual Studio 2008,类型为signed int的位字段被解释为signed 类型为unsigned int的位字段被解释为unsigned #include <stdio.h> #include <limits.h> /* This structure has one 8 bit field, whose type is unsigned int */ struct S { unsigned int num: CHAR_BIT; } x = { 255 }; int main(vo

类型为
signed int
的位字段被解释为
signed

类型为
unsigned int
的位字段被解释为
unsigned

#include <stdio.h>
#include <limits.h>
/* This structure has one 8 bit field, whose type is unsigned int */
struct S
{
    unsigned int num: CHAR_BIT;
} x = { 255 };

int main(void)
{

    if(x.num - 256 > 0)
        printf("signed\n");
    else
        printf("unsigned\n");

    return 0;
}
因此:

x.num = 0x000000FF
x.num & = 0x0FF -> 0x000000ff
x.num - = 0x100 -> 0xFFFFFFFF

0xFFFFFFFF = -1 
如果这是真的,那么:

 if(-1 > 0)   
    printf("signed");  
 else   
    printf("unsigned");
结果必须是“未签名”

有人能正确解释这些结果吗?

根据integer升级,“如果一个int可以表示原始类型的所有值,那么该值将转换为int;否则,它将转换为无符号int.”(这是C99中的6.3.1.1:2)

int可以包含宽度为8的无符号位字段的所有值,因此此无符号位字段提升为
int
。所以
x.num
x.num-256
都有类型
int

 if(-1 > 0)   
    printf("signed");  
 else   
    printf("unsigned");