类型为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");
结果必须“无符号”?
任何人都能正确解释这些结果吗?
答案 0 :(得分:3)
根据整数提升,“如果int可以表示原始类型的所有值,则该值将转换为int;否则,它将转换为unsigned int。“(这是C99中的6.3.1.1:2)。
int可以包含宽度为8的无符号位字段的所有值,因此该无符号位字段将提升为int
。因此x.num
和x.num - 256
都有int
类型。