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