intmain() { for (int i = 0; i < 10; ++i) { int32_t a = rand() % 0x10000; int16_t b = (int16_t)((a * a) >> 16); if (b > 0) { printf("b > 0, b = %d\n", b); } else { printf("b < 0, b = %d\n", b); } } }
采用不同的优化等级编译并运行:
1 2 3 4 5 6 7 8 9 10 11
❯ gcc -O0 -o main main.c && ./main b > 0, b = 4816 b > 0, b = 1279 b > 0, b = 23228 b > 0, b = 5248 b < 0, b = -16997 b > 0, b = 8648 b > 0, b = 21989 b > 0, b = 7907 b > 0, b = 970 b > 0, b = 15575
1 2 3 4 5 6 7 8 9 10 11
❯ gcc -O2 -o main main.c && ./main b > 0, b = 4816 b > 0, b = 1279 b > 0, b = 23228 b > 0, b = 5248 b > 0, b = -16997 b > 0, b = 8648 b > 0, b = 21989 b > 0, b = 7907 b > 0, b = 970 b > 0, b = 15575
❯ gcc -O2 -fsanitize=undefined -o main main.c && ./main b > 0, b = 4816 b > 0, b = 1279 b > 0, b = 23228 b > 0, b = 5248 main.c:30:30: runtime error: signed integer overflow: 56401 * 56401 cannot be represented in type 'int' b < 0, b = -16997 b > 0, b = 8648 b > 0, b = 21989 b > 0, b = 7907 b > 0, b = 970 b > 0, b = 15575