LINUX.ORG.RU

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

Исправление kaldeon, (текущая версия) :

Без проблем. Но это как раз тот случай, когда деталей накопилось слишком много и хелпер обретает смысл. Не из-за того, что любая операция, обёрнутая в функцию, автоматически становится лучше. «Мы не одинаковы.»

#include <u.h>
#include <libc.h>

s32int
midpoint(s32int foo, s32int bar)
{
	if (!(bar > 0 && foo > INT32_MAX - bar) && !(bar < 0 && foo < INT32_MIN - bar))
		return (foo + bar) / 2;
	else if (!(foo < 0 && bar > INT32_MAX + foo) && !(foo > 0 && bar < INT32_MIN + foo))
		return foo + (bar - foo) / 2;
	else
		return bar + (foo - bar) / 2;
}

void
main(void)
{
	print("%d\n", midpoint(-2000000000, -2000000000));
	print("%d\n", midpoint(-2000000000, +2000000000));
	print("%d\n", midpoint(+2000000000, -2000000000));
	print("%d\n", midpoint(+2000000000, +2000000000));

	exits(0);
}
% 9c test.c && 9l test.o && ./a.out
-2000000000
0
0
2000000000
% 

Исходная версия kaldeon, :

Без проблем. Но это как раз тот случай, когда деталей накопилось слишком много и хелпер обретает смысл. Не из-за того, что любая операция, обёрнутая в функцию, автоматически становится лучше. «Мы не одинаковы.»

#include <u.h>
#include <libc.h>

s32int
midpoint(s32int foo, s32int bar)
{
	if (!(bar > 0 && foo > INT32_MAX - bar) && !(bar < 0 && foo < INT32_MIN - bar))
		return (foo + bar) / 2;
	else if (!(foo < 0 && bar > INT32_MAX + foo) && !(foo > 0 && bar < INT32_MIN + foo))
		return foo + (bar - foo) / 2;
	else
		return bar + (foo - bar) / 2;
}

void
main(void)
{
	print("%d\n", midpoint(-2000000000, -2000000000));
	print("%d\n", midpoint(-2000000000, +2000000000));
	print("%d\n", midpoint(+2000000000, -2000000000));
	print("%d\n", midpoint(+2000000000, +2000000000));

	exits(0);
}
9c test.c && 9l test.o && ./a.out