LINUX.ORG.RU

История изменений

Исправление 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