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");