とあるケイジバンに数値を任意の2〜16進数文字列に変換するプログラムの話題があったので、自分なりの回答を書いておく。関数名がどっかのOSみたいだな(笑)。

char *ntos( int n, int r )
{
  static char   buf[33];
  char         *p = &buf[32];
  unsigned int  a;


  /* 変換指定進数のチェック */
  if ( r < 2 || r > 16 ) {
    return NULL;
  }

  /* 値が0の時 */
  if ( n == 0 ) {
    *(--p) = '0';
    return p;
  }

  if ( n < 0 && r == 10 ) {
    /* 正の値に */
    a = -n;
  } else {
    a = n;
  }

  while ( a ) {
    *(--p) = "0123456789ABCDEF"[a % r];
    a /= r;
  }

  /* 10進数で負の値の時は符号付加 */
  if ( n < 0 && r == 10 ) {
    *(--p) = '-';
  }

  return p;
}

gcc 2.95.2ではOKな感じだ。