История изменений
Исправление Vic, (текущая версия) :
Пробиваем фанеру оптимизатору компилятора.
#include <stdio.h>
#include <stdbool.h>
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX-1)
int (*fooptr)(int) = NULL;
int foo(int x)
{
if (x < 0) x = -x;
return x;
}
int (*barptr)(int) = NULL;
int bar(int x)
{
x++;
return x;
}
void examine(int x) {
x = fooptr(x);
if(x==INT_MIN) printf("%d==%d\n", x, INT_MIN);
else printf("%d!=%d\n", x, INT_MIN);
if(x<0) printf("%d<0\n", x);
else printf("%d>=0\n", x);
}
void examine2(int x) {
x = barptr(x);
if(x==INT_MIN) printf("%d==%d\n", x, INT_MIN);
else printf("%d!=%d\n", x, INT_MIN);
if(x<0) printf("%d<0\n", x);
else printf("%d>=0\n", x);
}
int main(void) {
fooptr = foo;
barptr = bar;
examine(1);
examine(-1);
examine(INT_MIN);
examine2(INT_MAX);
return 0;
}
Результат:
1!=-2147483648
1>=0
1!=-2147483648
1>=0
-2147483648==-2147483648
-2147483648<0
-2147483648==-2147483648
-2147483648<0
Ни одно арифметическое действие не пострадало… чтд.
Исправление Vic, :
Пробиваем фанеру оптимизатору компилятора.
#include <stdio.h>
#include <stdbool.h>
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX-1)
int (*fooptr)(int) = NULL;
int foo(int x)
{
if (x < 0) x = -x;
return x;
}
int (*barptr)(int) = NULL;
int bar(int x)
{
return x++;
}
void examine(int x) {
x = fooptr(x);
if(x==INT_MIN) printf("%d==%d\n", x, INT_MIN);
else printf("%d!=%d\n", x, INT_MIN);
if(x<0) printf("%d<0\n", x);
else printf("%d>=0\n", x);
}
void examine2(int x) {
x = barptr(x);
if(x==INT_MIN) printf("%d==%d\n", x, INT_MIN);
else printf("%d!=%d\n", x, INT_MIN);
if(x<0) printf("%d<0\n", x);
else printf("%d>=0\n", x);
}
int main(void) {
fooptr = foo;
barptr = bar;
examine(1);
examine(-1);
examine(INT_MIN);
examine2(INT_MAX);
return 0;
}
Результат:
1!=-2147483648
1>=0
1!=-2147483648
1>=0
-2147483648==-2147483648
-2147483648<0
-2147483648==-2147483648
-2147483648<0
Ни одно арифметическое действие не пострадало… чтд.
Исправление Vic, :
Пробиваем фанеру оптимизатору компилятора.
#include <stdio.h>
#include <stdbool.h>
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX-1)
int (*fooptr)(int) = NULL;
int foo(int x)
{
if (x < 0) x = -x;
return x;
}
int (*barptr)(int) = NULL;
int bar(int x)
{
return x++;
}
void examine(int x) {
x = fooptr(x);
if(x==INT_MIN) printf("%d==%d\n", x, INT_MIN);
else printf("%d!=%d\n", x, INT_MIN);
if(x<0) printf("%d<0\n", x);
else printf("%d>=0\n", x);
}
void examine2(int x) {
x = barptr(x);
if(x == (int)INT_MIN) printf("%d==%d\n", x, INT_MIN);
else printf("%d!=%d\n", x, INT_MIN);
if(x<0) printf("%d<0\n", x);
else printf("%d>=0\n", x);
}
int main(void) {
fooptr = foo;
barptr = bar;
examine(1);
examine(-1);
examine(INT_MIN);
examine2(INT_MAX);
return 0;
}
Результат:
1!=-2147483648
1>=0
1!=-2147483648
1>=0
-2147483648==-2147483648
-2147483648<0
-2147483648==-2147483648
-2147483648<0
Ни одно арифметическое действие не пострадало… чтд.
Исправление Vic, :
Пробиваем фанеру оптимизатору компилятора.
#include <stdio.h>
#include <stdbool.h>
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX-1)
int (*fooptr)(int) = NULL;
int foo(int x)
{
if (x < 0) x = -x;
return x;
}
int (*barptr)(int) = NULL;
int bar(int x)
{
return x++;
}
void examine(int x) {
x = fooptr(x);
if(x==INT_MIN) printf("%d==%d\n", x, INT_MIN);
else printf("%d!=%d\n", x, INT_MIN);
if(x<0) printf("%d<0\n", x);
else printf("%d>=0\n", x);
}
void examine2(int x) {
x = barptr(x);
if(x == (int)INT_MIN) printf("%d==%d\n", x, INT_MIN);
else printf("%d!=%d\n", x, INT_MIN);
if(x<0) printf("%d<0\n", x);
else printf("%d>=0\n", x);
}
int main(void) {
fooptr = foo;
barptr = bar;
examine(1);
examine(-1);
examine(INT_MIN);
examine2(INT_MAX);
return 0;
}
Результат:
1!=-2147483648
1>=0
1!=-2147483648
1>=0
-2147483648==-2147483648
-2147483648<0
-2147483648==-2147483648
-2147483648<0
Ни одно математическое действие не пострадало… чтд.
Исходная версия Vic, :
Пробиваем фанеру оптимизатору компилятора.
#include <stdio.h>
#include <stdbool.h>
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX-1)
int (*fooptr)(int);
int foo(int x)
{
if (x < 0) x = -x;
return x;
}
int (*barptr)(int);
int bar(int x)
{
return x++;
}
void examine(int x) {
x = fooptr(x);
if(x==INT_MIN) printf("%d==%d\n", x, INT_MIN);
else printf("%d!=%d\n", x, INT_MIN);
if(x<0) printf("%d<0\n", x);
else printf("%d>=0\n", x);
}
void examine2(int x) {
x = barptr(x);
if(x == (int)INT_MIN) printf("%d==%d\n", x, INT_MIN);
else printf("%d!=%d\n", x, INT_MIN);
if(x<0) printf("%d<0\n", x);
else printf("%d>=0\n", x);
}
int main(void) {
fooptr = foo;
barptr = bar;
examine(1);
examine(-1);
examine(INT_MIN);
examine2(INT_MAX);
return 0;
}
Результат:
1!=-2147483648
1>=0
1!=-2147483648
1>=0
-2147483648==-2147483648
-2147483648<0
-2147483648==-2147483648
-2147483648<0
Ни одно математическое действие не пострадало… чтд.