intからlongへの変換(C言語)?

ちょっとショックなコードを見たのでそのことを書きます。

long itol(int n) {
    char buffer[64];
    sprintf(buffer, "%d", n);
    return atol(buffer);
}

どういう動機があってこんな関数を書いたのか、使い所(デッドコードじゃなかったんです)をどうやって決めたか分かりません。

みると、そばにこんな関数もありました。

int ltoi(long n) {
    char buffer[64];
    sprintf(buffer, "%ld", n);
    return atoi(buffer);
}

どうも、intとlongのサイズが違う環境に移植するときに、とにかくコンパイル警告だけでないようにしちゃった感じです。で、ltoiを書いたついでにitolってのも書いたんでしょうか。

それならと僕も別の実装を考えてみました。

long itol(int n) {
    return n == 0
        ? 0L
        : 0 < n
            ? itol(n - 1) + 1L
            : itol(n + 1) - 1L;
}

最適化かければいけると思うんですよね。もちろんスラッシングは解決しないですけどね…