Я думаю, я навіть не збираюся намагатися написати короткий код. Я спробую виконати це порівняння способом, який є портативним за специфікацією C99.
int a, b; // Let's assume these are initialized
int sign_a = a ? ((a|7)^2)%2 + ((a|7)^3)%2 : 0;
Оператор модуля зберігає знак, але він цілком може створити нуль (включаючи від’ємний нуль), тому ми гарантуємо, що ми перевіряємо як непарне, так і парне значення (навіть не знаючи, чи використовуємо вони доповнення). Арифметичні операції можуть переповнюватись, але порозрядно не буде, і, гарантуючи, що є біти, як встановлені, так і очищені, ми уникаємо ненавмисного перетворення нашого числа у від’ємний нуль або значення пастки. Факт, що для цього потрібно зробити дві дивні дії, не має значення, оскільки можливе подання пастки не викликає невизначеної поведінки, поки не буде поставлено значення. Виконуючи операцію з переключеним бітом 0, ми отримуємо рівно один ненульовий залишок. Озброївшись знаннями обох ознак, ми можемо вирішити, як діяти зі порівнянням.
char result="\0<<>=<>>\0"[4+3*sign_a+sign_b]
if (!result) { // signs matching means subtraction won't overflow
int diff=a-b;
int sign_diff=diff ? (diff|7^2)%2 + (diff|7^3)%2 : 0;
result = ">=<"[1-sign_diff];
}
Цей спосіб може бути одним з небагатьох, що дозволяє витягувати знак цілого від’ємного нуля. Ми вирішуємо це, чітко перевіряючи нуль. Якби ми займалися гольфом по-справжньому, ми могли б, звичайно, дозволити порівняння двох нулів, щоб також виконати віднімання.
abs
без включення файлу бібліотеки (оскільки компілятор це все одно знає), також не дозволено?