これはちょっとばかげた質問で、私はしばらく頭に浮かんでいましたが、通常のプリミティブ (またはプリミティブの組み合わせ. .. no long long ...
s) であるため、メモリ内のバイト配列を使用できると思います。
n バイト (n は何か大きなもの) の長さのバイト配列がある場合、10 進数の整数であるかのように、バイト配列を正しく出力するにはどうすればよいでしょうか。単なる回答ではなく、説明が望ましいでしょう。
これはちょっとばかげた質問で、私はしばらく頭に浮かんでいましたが、通常のプリミティブ (またはプリミティブの組み合わせ. .. no long long ...
s) であるため、メモリ内のバイト配列を使用できると思います。
n バイト (n は何か大きなもの) の長さのバイト配列がある場合、10 進数の整数であるかのように、バイト配列を正しく出力するにはどうすればよいでしょうか。単なる回答ではなく、説明が望ましいでしょう。
最も単純な (実装して理解する) 方法は、数を繰り返し 10 で割り、剰余を収集することです。例:
1234 / 10 = 123, 4
123 / 10 = 12, 3
12 / 10 = 1, 2
1 / 10 = 0, 1
次に、残りを (逆の順序で) 印刷します。
一連のバイトを 10 で割るときは、最上位バイトから始めて、各バイトを個別に分割します。そして、すべてのバイトを処理するまで、除算の残りを次のバイトに運びます。
int divBytesBy10(unsigned char* bytes, size_t count, unsigned char* remainder)
{
unsigned carryOver = 0;
int nonZeroQuotient = 0;
while (count--)
{
carryOver = carryOver * 256 + *bytes;
*bytes = carryOver / 10;
carryOver %= 10;
nonZeroQuotient |= *bytes++;
}
*remainder = carryOver;
return nonZeroQuotient;
}
完全な例:
#include <stdio.h>
int divBytesBy10(unsigned char* bytes, size_t count, unsigned char* remainder)
{
unsigned carryOver = 0;
int nonZeroQuotient = 0;
while (count--)
{
carryOver = carryOver * 256 + *bytes;
*bytes = carryOver / 10;
carryOver %= 10;
nonZeroQuotient |= *bytes++;
}
*remainder = '0' + carryOver; // convert to ASCII right here
return nonZeroQuotient;
}
int main(void)
{
unsigned char num[] = {0xFF, 0xFF, 0xFF, 0xFF};
char str[11], *p = str + sizeof(str) - 1;
*p = '\0';
while (divBytesBy10(num, sizeof(num), --p)) {}
printf("%s\n", p);
return 0;
}
出力 ( ideone ):
4294967295