【C言語】
コンパイラによっては
int型の 1ビットフィールドは
【0/-1】しか取れない

warning: comparison is always false due to limited range of data type

警告:データ型の範囲制限ため比較は常に偽になります。
[-Wtype-limits]


■1.ビットフィールドを「単なる」int 型で定義してはいけない

#include    <stdint.h>
#include    <stdio.h>
void NG(void)
{
    struct  tag     {
        int only1bit:1 ;//コンパイラ依存
    } x = {
        .only1bit = 1
    };
    printf("%d\n",x.only1bit);
    x.only1bit = 1; 
    if(x.only1bit == 1){
        printf("THEN %d\n",x.only1bit);
    }else{
        //gcc,clangはこちらを通過
        printf("ELSE %d\n",x.only1bit);
    }
}

signed/unsigned が明示されていない単なる int 型のビットフィールドのsigned/unsignedはコンパイラに依存します。

gcc/clangの場合はsigned になるため1bitしかないビットフィールドは【0/-1】しか表現できません。

1は表現できないので
     if(x.only1bit == 1){ 
は成立しません。


■2.ビットフィールドは unsigned int(uint32_t) 型で定義する(推奨)

void OK(void)
{
    struct  tag     {
        uint32_t only1bit:1 ;//コンパイラ非依存
    } x = {
        .only1bit = 1
    };
    printf("%d\n",x.only1bit);
    x.only1bit = 1; 
    if(x.only1bit == 1){
        //こちらを通過
        printf("THEN %d\n",x.only1bit);
    }else{
        printf("ELSE %d\n",x.only1bit);
    }
}

signed/unsigned が明示されたビットフィールドは
コンパイラに依存しません

ビットフィールドは【0/1】を表現できるので
     if(x.only1bit == 1){ 
は成立します。

参考:

INT12-C. 式中で使用される単なるintのビットフィールドの型について勝手な想定をしない

https://www.jpcert.or.jp/sc-rules/c-int12-c.html