【C言語】
0xFFFFffffが-1になり -1が255になる 暗黙の型変換とは?

warning: comparison of integer expressions of different signedness: ‘signed char’ and ‘unsigned int’

警告:符号の異なる整数式の比較
[-Wsign-compare]


■問題1.0xFFFFffffと-1は等しい?

次のプログラムは何と表示されるでしょうか?

#include    <stdio.h>
int main(void) {
    if(-1 == 0xFFFFffff)    puts("同じ");
    else                    puts("違う");
    signed char c = -1 ;
    if(c == 0xFFFFffff)     puts("同じ");
    else                    puts("違う");
    if(c == 0xFFFFffffU)    puts("同じ");
    else                    puts("違う");

    printf("-1=%x\n",-1);
    printf("0xFFFFffff=%d\n",0xFFFFffff);
    printf("0xFFFFffff=%u\n",0xFFFFffff);
}

型変換は難解なので
正解できる人は非常に少ないです。

標準ヘッダ limits.h の最大値、最小値を
無視した値の代入や比較は
理解不能なコードになるので止めましょう。

●問題1の解答

同じ
同じ
同じ
-1=ffffffff
0xFFFFffff=-1
0xFFFFffff=4294967295

■問題2.unsigned charに-1を代入すると?

warning: implicit conversion changes signedness: ‘int’ to ‘unsigned char’

警告:暗黙の型変換:int から符号無しchar
[-Wsign-conversion]

次のプログラムは何と表示されるでしょうか?

#include    <stdio.h>
int     main(void) {
    unsigned char   uc = 255;
    printf("%d\n",uc); 
    
    uc = -1;
    printf("%d\n",uc);
    
    uc = (unsigned char)-1;
    printf("%d\n",uc);
}

unsigned char で表現可能な値は通常0~255で、-1は表現できません。※正確にはコンパイラから提供されているlimits.hを参照してください。
表現できない-1を無理やり代入してコンパイラから警告されたらキャストで逃げるのは止めましょう。
255を表現したかったのか
-1を表現したかったのか分からなくなります。

●問題2の解答

255
255
255

■問題3.signed charに255を代入すると?

warning: implicit conversion from ‘int’ to ‘signed char’ changes value from 255 to -1

警告:暗黙の型変換:int から符号付きchar
[-Wconstant-conversion]

次のプログラムは何と表示されるでしょうか?

#include    <stdio.h>
int main(void) {
    signed char   sc; 
    sc = -1;
    printf("%d\n",sc);
    
    sc = 255;               
    printf("%d\n",sc);
    
    sc = (signed char)255;  
    printf("%d\n",sc);
}

標準ヘッダ limits.h の値を無視して無理やり値設定し
コンパイラが警告を出すと、
キャストして警告を黙らせるプログラマは多くいますが
limits.h を無視した値設定は止めましょう。

●問題3の解答

-1
-1
-1

参考:

CWE-194: Unexpected Sign Extension