Не проверено. Без использования 2-х дополнений:
#include <stdlib.h>
#include <stdio.h>
int sillyNegate(int x) {
if (x <= 0)
return abs(x);
else {
// setlocale(LC_ALL, "C"); // if necessary.
char buffer[256];
snprintf(buffer, 255, "%c%d", 0x2d, x);
sscanf(buffer, "%d", &x);
return x;
}
}
Предполагая, что длина int
намного меньше, чем 255, и обратный обход snprintf / sscanf не приведет к какому-либо неопределенному поведению (верно? Верно?).
Вычитание может быть вычислено с использованием a - b == a + (-b).
Альтернатива:
#include <math.h>
int moreSillyNegate(int x) {
return x * ilogb(0.5); // ilogb(0.5) == -1;
}