追記:M1 MacのX codeのcharは符号有り
# include <stdio.h>
# include <limits.h>
int main(void)
{
char c = -1;
printf("%d\n", c);
printf("(CHAR_MAX == SCHAR_MAX) = %d\n", CHAR_MAX == SCHAR_MAX);
return 0;
}
をx86
アーキテクチャで実行すると
-1
(CHAR_MAX == SCHAR_MAX) = 1
となりますが、 AArch64
(ARM 64bit) では
255
(CHAR_MAX == SCHAR_MAX) = 0
となります。char
と書いたときに符号有りになるか符号無しになるかでこの違いが生じます。これは未定義動作ではないので -fsanitize=undefined
で捕まえられないし、 -Wall -Wextra
を付けてもコンパイラは教えてくれません…😭
確認は gcc 10.2 と LLVM CLang 11.0 で行いました。