【C言語】
引き算の結果をゼロと比較するのは避けよう

warning: comparison of unsigned expression in ‘< 0’ is always false

警告:符号無しは負値にならない
[-Wtype-limits]


■uint8_t(1-2)<0 が成立する

#include    <stdio.h>
#include    <stdint.h>
int main(void) {
    uint8_t  u1 = 1;
    uint8_t  u2 = 2;
    if((u1 - u2) < 0)   
        puts("負");
    else                
        puts("正");
}

1-2が負値になり直観と同じ結果となります。


■uint32_t(1-2)<0 が不成立

#include    <stdio.h>
#include    <stdint.h>
int main(void) {
    uint32_t  u1 = 1;
    uint32_t  u2 = 2;
    if((u1 - u2) < 0)   
        puts("負");
    else                
        puts("正");
}

1-2が負値にならず直観と異なる結果となります。

C言語の型変換規則は非常に難解です。
符号無しの引き算を行った場合
直観とは異なる結果になる場合があります。
型変換規則を完全に理解する前に、
型変換規則は難解である事を理解しましょう。

■int32_t(1-2)<0U が不成立

warning: comparison of unsigned expression in ‘< 0’ is always false

警告: ‘< 0’ と符号なし式の比較は常に偽
[-Wtype-limits]

#include    <stdio.h>
#include    <stdint.h>
int main(void) {
    int32_t s1 = 1;
    int32_t s2 = 2;
    if((s1 - s2) < 0U)
        puts("負");
    else
        puts("正");    
}

1-2が負値にならず直観と異なる結果となります。

C言語の型変換規則は非常に難解です。
符号付きの引き算と0Uを比較した場合
直観とは異なる結果になる場合があります。


このコードの場合0Uと比較しているので
演算子の両辺が符号無し型となります。
このため (s1 – s2) は引き算の結果に関係無く
0以上の値となります。