2

具有类型的位域signed int被解释为signed. 类型被解释为
的位域。unsigned intunsigned

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

结果必须是“未签名”

谁能正确解释这些结果?

4

1 回答 1

3

根据整数促销,“如果一个 int 可以表示原始类型的所有值,则将该值转换为 int;否则,它将转换为无符号整数。” (这是 C99 中的 6.3.1.1:2)。

一个 int 可以包含宽度为 8 的无符号位域的所有值,因此这个无符号位域被提升为int. 所以x.numx.num - 256两者都有 type int

于 2013-08-01T17:19:47.500 回答