具有类型的位域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");
结果必须是“未签名”?
谁能正确解释这些结果?