16

要約:私は次のコードを期待していました:cout << uint8_t(0); 「0」を印刷しますが、何も印刷しません。

長いバージョン:uint8_tオブジェクトをcoutにストリーミングしようとすると、gccで奇妙な文字が表示されます。これは予想される動作ですか?uint8_tがcharベースのタイプのエイリアスである可能性がありますか?コード例のコンパイラ/システムノートを参照してください。

// compile and run with:
// g++ test-uint8.cpp -std=c++11 && ./a.out
//                    -std=c++0x (for older gcc versions)
/**
 * prints out the following with compiler:
 *     gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)
 * on the system:
 *     Linux 3.7.9-101.fc17.x86_64
 * Note that the first print statement uses an unset uint8_t
 * and therefore the behaviour is undefined. (Included here for
 * completeness)

> g++ test-uint8.cpp -std=c++11 && ./a.out
>>>�&lt;<<    >>>194<<<
>>><<<    >>>0<<<
>>><<<    >>>0<<<
>>><<<    >>>0<<<
>>><<<    >>>1<<<
>>><<<    >>>2<<<

 *
 **/

#include <cstdint>
#include <iostream>

void print(const uint8_t& n)
{
    std::cout << ">>>" << n                 << "<<<    "
              << ">>>" << (unsigned int)(n) << "<<<\n";
}

int main()
{
    uint8_t a;
    uint8_t b(0);
    uint8_t c = 0;
    uint8_t d{0};
    uint8_t e = 1;
    uint8_t f = 2;
    for (auto i : {a,b,c,d,e,f})
    {
        print(i);
    }
}
4

3 に答える 3

17

uint8_tはのエイリアスでunsigned charあり、iostreamには、数値をフォーマットするのではなく文字を出力する文字用の特別なオーバーロードがあります。

整数への変換はこれを禁止します。

于 2013-03-08T14:49:52.800 に答える
7

uint8_tがcharベースのタイプのエイリアスである可能性がありますか?

絶対。組み込みの8ビット符号なし整数型(そのような型が存在する場合)のtypedefである必要があります。可能な8ビットの符号なし整数型は2つしかないcharため、符号なしととして扱うコンパイラの場合は、そのunsigned charうちの1つである必要があります。8ビットより大きいシステムを除いてchar、その場合は存在しません。

于 2013-03-08T14:54:04.497 に答える
0

他の人が指摘しているように、uint8_tとしてストリーミングされますunsigned char。以下のPos構造体のように、スペースを無駄にしない場合に限り、キャストやオーバーロードを回避するために、整数としてストリーミングされる整数型のビットフィールドを使用することがあります。operator<<

#include <iostream>

struct WasteAbyte {
    unsigned short has_byte_range:8;
};

struct Pos {
    unsigned short x:8;
    unsigned short y:8;
};

int main() {
    WasteAbyte W = {255};

    ++W.has_byte_range;

    std::cout << W.has_byte_range << std::endl;

    std::cout << sizeof(WasteAbyte) << std::endl;
    std::cout << sizeof(Pos) << std::endl;

    return 0;
}

出力:

0
2
2
于 2017-11-23T19:33:23.460 に答える