有没有任何C实现有一个无用的单位`int`位域?

aut*_*tic 3 c c99 bit-fields c11

n1570的6.7.2.1p9说:

结构或联合的成员可以具有除可变修改类型之外的任何完整对象类型.另外,可以声明成员由指定数量的位组成(包括符号位,如果有的话).这样的成员称为位域; 124)其宽度前面有冒号.

我是否正确理解这表明单个成员struct { int bit:1; }可能是一个符号位?

如果是这种情况,则遵循这样的位字段可能存储在某些实现上的唯一值是,0并且-0其中-0可能与0一旦存储或陷阱表示无法区分.

是否有任何实际的实现只能将一个值分配给这样的位域?

ine*_*ght 5

gcc 4.9.2怎么样?

/* gcc -std=c11 -pedantic-errors -Wextra -Werror=all test.c */
#include <stdio.h>
#include <string.h>

struct foo {
    int bit:1;
};

int main() {
    struct foo f;
    f.bit = 0;
    f.bit = 1;

    printf("%i\n", f.bit);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译它会发出:

$ gcc -std=c11 -pedantic-errors -Wextra -Werror=all test.c
test.c: In function ‘main’: test.c:12:10: warning: overflow in
implicit constant conversion [-Woverflow]
  f.bit = 1;
          ^
Run Code Online (Sandbox Code Playgroud)

运行它发出:

$ ./a.out 
-1
Run Code Online (Sandbox Code Playgroud)

  • @undefinedbehaviour:不,这是一个实现定义的转换结果的例子.[N1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)6.3.1.3 p3.算术运算符上的有符号溢出具有未定义的行为; 在整数到符号转换上的有符号溢出产生实现定义的结果(或引发实现定义的信号). (4认同)