で数学を実行する関数をすでに実装していると仮定すると、数値uint128
を3つの部分に分割して、printfの組み込みの64ビット印刷機能を使用できます。最大の64ビットの数値は20桁の長さであるため、19桁の10進数はすべてそのように印刷できますが、最大の128ビットの数値は39桁の長さであるため、2つの部分に分割することはできません。 、最大の64ビット数よりも20桁大きい数になる可能性があるためです。
これを行う1つの方法は、最初に10 20で割って、3,402,823,669,209,384,634以下の商を取得することです。次に、余り(それ自体は10 20以下)を10 10で割って、別の商を取得し、余りはそれぞれ10 20未満で、どちらも64ビット整数に収まります。
void print_uint128(uint128 value)
{
// First power of 10 larger than 2^64
static const uint128 tenToThe20 = {7766279631452241920ull, 5ull};
static const uint128 tenToThe10 = {10000000000ull, 0ull};
// Do a 128-bit division; assume we have functions to divide, multiply, and
// subtract 128-bit numbers
uint128 quotient1 = div128(value, tenToThe20);
uint128 remainder1 = sub128(value, mul128(quotient, tenToThe20));
uint128 quotient2 = div128(remainder1, tenToThe10);
uint128 remainder2 = sub128(remainder1, mul128(remainder1, tenToThe10));
// Now print out theresult in 3 parts, being careful not to print
// unnecessary leading 0's
if(quotient1.low != 0)
printf("%llu%010llu%010llu", quotient1.low, quotient2.low, remainder2.low);
else if(quotient2.low != 0)
printf("%llu%010llu", quotient2.low, remainder2.low);
else
printf("%llu", remainder2.low);
}