История изменений
Исправление Vic, (текущая версия) :
Только всё ещё хуже оказалось, -O1 походу с некоторых пор тоже содержит -fstrict-overflow
Надеюсь, ты уже начинаешь догадываться, что воюешь еще не с арифметикой, а с оптимизатором компилятора.
Например, первая функция void examine(int x) компилируется в получения абсолютного значения и всего два printf:
82 # main.c:9: else printf("%d!=%d\n", x, INT_MIN);
83 0008 C7442408 mov DWORD PTR [esp+8], -2147483648 #,
84 0010 C7042400 mov DWORD PTR [esp], OFFSET FLAT:LC0 #,
# if(x<0) x = -x;
85 0017 89D8 mov eax, ebx # tmp89, x
86 0019 C1F81F sar eax, 31 # tmp89,
87 001c 31C3 xor ebx, eax # x, tmp89
88 001e 29C3 sub ebx, eax # x, tmp89
89 0020 895C2404 mov DWORD PTR [esp+4], ebx #, x
90 0024 E8000000 call _printf # else printf("%d!=%d\n", x, INT_MIN);
90 00
91 # main.c:11: else printf("%d>=0\n", x);
92 0029 895C2404 mov DWORD PTR [esp+4], ebx #, x
93 002d C7042408 mov DWORD PTR [esp], OFFSET FLAT:LC1 #,
93 000000
94 0034 E8000000 call _printf # else printf("%d>=0\n", x);
Математикой, над кодированными в бинарном виде числами, можно рассматривать только вот этот кусочек:
if(x<0) x = -x;
85 0017 89D8 mov eax, ebx # tmp89, x
86 0019 C1F81F sar eax, 31 # tmp89,
87 001c 31C3 xor ebx, eax # x, tmp89
88 001e 29C3 sub ebx, eax # x, tmp89
Исправление Vic, :
Только всё ещё хуже оказалось, -O1 походу с некоторых пор тоже содержит -fstrict-overflow
Надеюсь, ты уже начинаешь догадываться, что воюешь еще не с арифметикой, а с оптимизатором компилятора.
Например, первая функция void examine(int x) компилируется в получения абсолютного значения и всего два printf (и у меня это не зависит от флагов -O*):
82 # main.c:9: else printf("%d!=%d\n", x, INT_MIN);
83 0008 C7442408 mov DWORD PTR [esp+8], -2147483648 #,
84 0010 C7042400 mov DWORD PTR [esp], OFFSET FLAT:LC0 #,
# if(x<0) x = -x;
85 0017 89D8 mov eax, ebx # tmp89, x
86 0019 C1F81F sar eax, 31 # tmp89,
87 001c 31C3 xor ebx, eax # x, tmp89
88 001e 29C3 sub ebx, eax # x, tmp89
89 0020 895C2404 mov DWORD PTR [esp+4], ebx #, x
90 0024 E8000000 call _printf # else printf("%d!=%d\n", x, INT_MIN);
90 00
91 # main.c:11: else printf("%d>=0\n", x);
92 0029 895C2404 mov DWORD PTR [esp+4], ebx #, x
93 002d C7042408 mov DWORD PTR [esp], OFFSET FLAT:LC1 #,
93 000000
94 0034 E8000000 call _printf # else printf("%d>=0\n", x);
Математикой, над кодированными в бинарном виде числами, можно рассматривать только вот этот кусочек:
if(x<0) x = -x;
85 0017 89D8 mov eax, ebx # tmp89, x
86 0019 C1F81F sar eax, 31 # tmp89,
87 001c 31C3 xor ebx, eax # x, tmp89
88 001e 29C3 sub ebx, eax # x, tmp89
Исправление Vic, :
Только всё ещё хуже оказалось, -O1 походу с некоторых пор тоже содержит -fstrict-overflow
Надеюсь, ты уже начинаешь догадываться, что воюешь еще не с арифметикой, а с оптимизатором компилятора.
Например, первая функция void examine(int x) компилируется в получения абсолютного значения и всего два printf:
82 # main.c:9: else printf("%d!=%d\n", x, INT_MIN);
83 0008 C7442408 mov DWORD PTR [esp+8], -2147483648 #,
84 0010 C7042400 mov DWORD PTR [esp], OFFSET FLAT:LC0 #,
# if(x<0) x = -x;
85 0017 89D8 mov eax, ebx # tmp89, x
86 0019 C1F81F sar eax, 31 # tmp89,
87 001c 31C3 xor ebx, eax # x, tmp89
88 001e 29C3 sub ebx, eax # x, tmp89
89 0020 895C2404 mov DWORD PTR [esp+4], ebx #, x
90 0024 E8000000 call _printf # else printf("%d!=%d\n", x, INT_MIN);
90 00
91 # main.c:11: else printf("%d>=0\n", x);
92 0029 895C2404 mov DWORD PTR [esp+4], ebx #, x
93 002d C7042408 mov DWORD PTR [esp], OFFSET FLAT:LC1 #,
93 000000
94 0034 E8000000 call _printf # else printf("%d>=0\n", x);
Математикой, над кодированными в бинарном виде числами, можно рассматривать только вот этот кусочек:
if(x<0) x = -x;
85 0017 89D8 mov eax, ebx # tmp89, x
86 0019 C1F81F sar eax, 31 # tmp89,
87 001c 31C3 xor ebx, eax # x, tmp89
88 001e 29C3 sub ebx, eax # x, tmp89
Исправление Vic, :
Только всё ещё хуже оказалось, -O1 походу с некоторых пор тоже содержит -fstrict-overflow
Надеюсь, ты уже начинаешь догадываться, что воюешь еще не с арифметикой, а с оптимизатором компилятора.
Например, первая функция void examine(int x) компилируется в получения абсолютного значения и всего два printf:
82 # main.c:9: else printf("%d!=%d\n", x, INT_MIN);
83 0008 C7442408 mov DWORD PTR [esp+8], -2147483648 #,
84 0010 C7042400 mov DWORD PTR [esp], OFFSET FLAT:LC0 #,
# if(x<0) x = -x;
85 0017 89D8 mov eax, ebx # tmp89, x
86 0019 C1F81F sar eax, 31 # tmp89,
87 001c 31C3 xor ebx, eax # x, tmp89
88 001e 29C3 sub ebx, eax # x, tmp89
89 0020 895C2404 mov DWORD PTR [esp+4], ebx #, x
90 0024 E8000000 call _printf # else printf("%d!=%d\n", x, INT_MIN);
90 00
91 # main.c:11: else printf("%d>=0\n", x);
92 0029 895C2404 mov DWORD PTR [esp+4], ebx #, x
93 002d C7042408 mov DWORD PTR [esp], OFFSET FLAT:LC1 #,
93 000000
94 0034 E8000000 call _printf # else printf("%d>=0\n", x);
Математикой, над кодированными в бинарном виде числами, можно рассматривать только вот этот кусочек:
x = -x;
85 0017 89D8 mov eax, ebx # tmp89, x
86 0019 C1F81F sar eax, 31 # tmp89,
87 001c 31C3 xor ebx, eax # x, tmp89
88 001e 29C3 sub ebx, eax # x, tmp89
Исходная версия Vic, :
Только всё ещё хуже оказалось, -O1 походу с некоторых пор тоже содержит -fstrict-overflow
Надеюсь, ты уже начинаешь догадываться, что воюешь еще не с арифметикой, а с оптимизатором компилятора.
Например, первая функция void examine(int x) компилируется в получения абсолютного значения и всего два printf:
82 # main.c:9: else printf("%d!=%d\n", x, INT_MIN);
83 0008 C7442408 mov DWORD PTR [esp+8], -2147483648 #,
84 0010 C7042400 mov DWORD PTR [esp], OFFSET FLAT:LC0 #,
# if(x<0) x = -x;
85 0017 89D8 mov eax, ebx # tmp89, x
86 0019 C1F81F sar eax, 31 # tmp89,
87 001c 31C3 xor ebx, eax # x, tmp89
88 001e 29C3 sub ebx, eax # x, tmp89
89 0020 895C2404 mov DWORD PTR [esp+4], ebx #, x
90 0024 E8000000 call _printf # else printf("%d!=%d\n", x, INT_MIN);
90 00
91 # main.c:11: else printf("%d>=0\n", x);
92 0029 895C2404 mov DWORD PTR [esp+4], ebx #, x
93 002d C7042408 mov DWORD PTR [esp], OFFSET FLAT:LC1 #,
93 000000
94 0034 E8000000 call _printf # else printf("%d>=0\n", x);
Математикой, над кодированными в бинарном виде числами, можно рассматривать только вот этот кусочек:
if(x<0) x = -x;
85 0017 89D8 mov eax, ebx # tmp89, x
86 0019 C1F81F sar eax, 31 # tmp89,
87 001c 31C3 xor ebx, eax # x, tmp89
88 001e 29C3 sub ebx, eax # x, tmp89