位字段中的整数表示

时间:2013-08-01 17:10:21

标签: 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(void)
{

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

    return 0;
}

在32位Windows计算机上,使用Visual Studio 2008,此代码输出:
“签名”

表达式(x.num - 256 > 0)的类型是什么? 如果是unsigned int,则unsigned int无法表示为int,因此需要将其提升为unsigned int,结果将“无符号“?

另外,当我查看汇编列表输出时:

mov eax, DWORD PTR _x
and eax, 255            ; 000000ffH
sub eax, 256            ; 00000100H

因此:

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

0xFFFFFFFF = -1 

如果是这样,那么:

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

结果必须“无符号”

任何人都能正确解释这些结果吗?

1 个答案:

答案 0 :(得分:3)

根据整数提升,“如果int可以表示原始类型的所有值,则该值将转换为int;否则,它将转换为unsigned int。“(这是C99中的6.3.1.1:2)。

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