1

これは安全ですか:

int main()
{
    boost::int16_t t1 = 50000; // overflow here.
    boost::uint16_t t2 = (boost::uint16_t)t1;
    std::cout << t1 << " "  << t2 <<  std::endl;
}

さらに具体的に言うと、スキーマで符号付き型を使用しているテーブルにこのデータを格納していますが、この方法でこのデータを格納および取得しても安全ですか?

ありがとう!

4

3 に答える 3

5

いいえ、これは実装で定義されていると思います。C ++ドラフト標準から、§4.7/ 3

宛先タイプが署名されている場合、宛先タイプ(およびビットフィールド幅)で表すことができれば、値は変更されません。それ以外の場合、値は実装によって定義されます。

これは最初のステートメントに適用されます。 int16_tは署名されており、50000を表すことはできません。したがって、の値はt1実装によって異なります。

がわかったらt1t2§4.7/2によってuint16_t2^16からの最低合同モジュラスであることが保証されt1ます。基本的に、t1mod 2^16です。

于 2010-11-22T09:27:20.637 に答える
1

安全だと思いますが、この誤解を招くキャストを行わずにuint16_tを使用してみませんか?

コンパイルプロセスのためだけでなく、通信のためのタイプも存在します。

于 2010-11-22T09:27:40.263 に答える
0

符号付きタイプで表すことができない番号の割り当ては、実装によって定義されます。ただし、次の変換には、標準で定義された動作があります。したがって、関数の結果は実装で定義され、それが安全であるかどうかにかかわらず、主観的な問題です。しかし、プラットフォームやコンパイラ間で移植可能ではありません。

于 2010-11-22T09:37:20.993 に答える