Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以g+打印uu int128+;? 我在C++程序中使用GCC内置类型 -y12128/COD>,没有什么真正意义的,至少不足以证明只使用BigIt库,但足以防止完全删除它。_C++_Iostream_Int128 - Fatal编程技术网

如何以g+打印uu int128+;? 我在C++程序中使用GCC内置类型 -y12128/COD>,没有什么真正意义的,至少不足以证明只使用BigIt库,但足以防止完全删除它。

如何以g+打印uu int128+;? 我在C++程序中使用GCC内置类型 -y12128/COD>,没有什么真正意义的,至少不足以证明只使用BigIt库,但足以防止完全删除它。,c++,iostream,int128,C++,Iostream,Int128,当我遇到我的类的打印部分时,我的问题就来了,下面是一个简单的例子: #include <iostream> int main() { __int128 t = 1234567890; std::cout << t << std::endl; return t; } 是的,我知道,有很多行解释说,\uu int128处理不当 是否有一种简单的方法可以让\uu int128像任何其他数字类型一样由iostream打印 编辑:对于那些仍然混淆C和

当我遇到我的类的打印部分时,我的问题就来了,下面是一个简单的例子:

#include <iostream>

int main()
{
  __int128 t = 1234567890;

  std::cout << t << std::endl;

  return t;
}
是的,我知道,有很多行解释说,
\uu int128
处理不当

是否有一种简单的方法可以让
\uu int128
像任何其他数字类型一样由
iostream
打印


编辑:对于那些仍然混淆C和C++的人,是的,我读到了这个问题:但是,这是C++而不是我现在所要求的C++。

< P>我建议不要重载<代码>运算符> P>股票[Cuth] > CUT不处理<代码> Iy12128/COD>,但可以用自己的函数扩展。 对于初学者,请编写如下代码:

std::ostream& operator<<(std::ostream& os, __int128 t) {
    // TODO: Convert t to string
    return os << str;
}

std::ostream&operator如果您不需要任何花哨的格式选项,请编写

您自己的
如果不是性能关键,这里有一种简单易读的方法,可以将非负的int128转换为base-10字符串(当然可以打印):

我们可以通过将数字分为更大的块而不是一次一个,从而使速度提高数倍。但它要求我们检查每个数据块中是否有丢失的前导零,并将它们重新添加:

std::string toString(__int128 num) {
    auto tenPow18 = 1000000000000000000;
    std::string str;
    do {
        long long digits = num % tenPow18;
        auto digitsStr = std::to_string(digits);
        auto leading0s = (digits != num) ? std::string(18 - digitsStr.length(), '0') : "";
        str = leading0s + digitsStr + str;
        num = (num - digits) / tenPow18;
    } while (num != 0);
    return str;
}

注意:我还为unsignedint128s发布了此答案的一个版本。

到目前为止,答案都很好,但我只想补充一下James Kanze的答案。首先请注意,由于无符号转换,它将不适用于数字
-0x800000000000000000000000
。其次,您可以利用使用64位整数打印的优势,优化函数实现,如下所示:

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);
}

std::ostream&operator一种看似简单的方法

std::ostream& operator<<(std::ostream& o, const __int128& x) {
    if (x == std::numeric_limits<__int128>::min()) return o << "-170141183460469231731687303715884105728";
    if (x < 0) return o << "-" << -x;
    if (x < 10) return o << (char)(x + '0');
    return o << x / 10 << (char)(x % 10 + '0');
}


std::ostream&operator阅读此问题(并回答),我的问题是关于
g++
的,而不是关于
gcc
。。。我希望能够使用
iostream
,而不是
printf
。另一个问题似乎同样适用于C,就像它适用于C++一样:这种类型没有标准库支持。你必须自己创建一些东西。我期待的答案是通过重载运算符<代码>这个问题比看起来困难,你必须考虑<代码> STD::HEX < /C>和<代码> SEtW商店< /代码>操作器。well@TemplateRex你是对的。。。我甚至没有考虑过这些……什么弦?十进制还是十六进制?这与标准操纵器(例如)不兼容,因此可能令人惊讶。我认为这是最有希望的答案。然后,我需要把它和这个结合起来,它应该能工作。感谢您至少应该提到它是未定义的行为,并且一旦库添加了对该类型的适当支持,它就会中断,必须立即退出。(如果你想正确处理所有的标志,这绝对不是小事。)@TemplateRex是否与标准操纵器兼容取决于他的TODO的内容。我已经编写了兼容的插入运算符(尽管它涉及很多额外的代码)。但由于这基本上是一个临时解决方案,他可能不需要完全兼容;我只会根据需要添加支持。@JamesKanze因为它是临时的,所以我建议编写一个函数字符串_int128,以强调它不是一个成熟的可打印类型。用法as
cout“但如果不是这样的话,我会非常惊讶”--gcc以基于不发生签名溢出的假设进行积极优化而闻名,因此我不会像您那样惊讶。类似于
-(value+1)+\uuuu uint128\u t(1)
的内容应该是有效的,并且很有可能被优化人员发现为相当于
-value
@hvd Yes的概括版本。我可能想看看生成的代码。然而,在这个特殊的例子中,我从来没有看到它失败过,可能是因为假设没有溢出,就不会触发任何优化。但是你的建议很好,我将来肯定会在类似的情况下采纳。(这比我过去提出的所有解决方法都简单得多。)我想这有点牵强,但是知道
tmp
总是在
int128_t
的范围内(因为不可能发生有符号整数溢出)可能会导致
tmp%10
tmp/=10
使用有符号除法指令,如果该版本比未签名版本更有效。这将因为显而易见的原因而失败。更有可能的情况是,用户使用
-ftrapv
或等效工具进行调试构建编译,然后否定就在那里爆发了。但是你可以提出一个论点,如果你不支持,用户不应该这样做。所以基本上,我有点同意:它很可能会起作用。@hvd是的。这实际上是一个问题,为了确保法规遵从性,您应该在临时代码中投入多少工作。(在永久性代码中,我肯定会使用更健壮的东西。编写起来不那么简单,理解起来也不那么简单。)下面的示例可以用clang++编译,但不能用g++编译。这有点做作,我不完全理解g++失败的原因(模棱两可的重载)。。。我把它做得尽可能小:由于某种原因,标志恢复似乎不能正常工作。我不知道到底是什么问题,但如果有人发现了,让我知道你是罗杜海基亚!你的第一种方法对负数不太好。@HolKann这是真的,我只是添加了一个注释来澄清。谢谢。当你为整型做模板时,同样的参数正是你应该做的
std::string toString(__int128 num) {
    auto tenPow18 = 1000000000000000000;
    std::string str;
    do {
        long long digits = num % tenPow18;
        auto digitsStr = std::to_string(digits);
        auto leading0s = (digits != num) ? std::string(18 - digitsStr.length(), '0') : "";
        str = leading0s + digitsStr + str;
        num = (num - digits) / tenPow18;
    } while (num != 0);
    return str;
}
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);
}
std::ostream& operator<<(std::ostream& o, const __int128& x) {
    if (x == std::numeric_limits<__int128>::min()) return o << "-170141183460469231731687303715884105728";
    if (x < 0) return o << "-" << -x;
    if (x < 10) return o << (char)(x + '0');
    return o << x / 10 << (char)(x % 10 + '0');
}