LINUX.ORG.RU

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

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

Ни одно математическое действие не пострадало… чтд.