How to print __int128 in g++?

前端 未结 6 1767
再見小時候
再見小時候 2020-12-05 06:48

I am using the GCC built-in type __int128 for a few things in my C++ program, nothing really significant, at least not enough to justify to use BigInt library o

6条回答
  •  执念已碎
    2020-12-05 06:57

    The answers so far are good, but I just wanted to add to the answer from James Kanze. Firstly note that because of the unsigned conversion, it will not work for the number -0x80000000000000000000000000000000. Secondly, you can advantage the fact that printing with 64-bit integers works, to optimize the function implementation as follows:

    std::ostream& operator<<(std::ostream& os, __int128_t value) {
        if (value < 0) {
            os << '-';
            value = -value;
        }
        // save flags to restore them
        std::ios_base::fmtflags flags(os.flags());
        // set zero fill
        os << std::setfill('0') << std::setw(13);
    
        // 128-bit number has at most 39 digits,
        // so the below loop will run at most 3 times
        const int64_t modulus = 10000000000000; // 10**13
        do {
            int64_t val = value % modulus;
            value /= modulus;
            if (value == 0) {
                os.flags(flags);
                return os << val;
            }
            os << val;
        } while (1);
    }
    

提交回复
热议问题