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以上の値となります。