これは推奨される方法(または未定義の動作)の問題ではありませんが、整数型のすべてのバイトをの値に変換することに関して、 c++
(unsigned char)0
標準が実際に保証することについてです。
質問)
以下のスニペットでは、ifステートメントで使用される式はc ++ 11でtrueと評価されることが保証されていますか?
std::memset (
reinterpret_cast<char*> (&a), // int a;
(unsigned char)0,
sizeof (int)
);
if (a == 0) {
...
}
C99およびC++11標準(この投稿のさらに下)からの引用を読むことにより、C99は、すべてのビットが設定された整数型がその型の値を表すことを明示的に保証していることがわかります。0
0
この保証はC++11標準では見つかりません。
- そのような保証はありませんか?
- 前のスニペットの結果は本当に実装固有ですか?
C99(ISO / IEC 9899:1999)
5.2.1.2/1マルチバイト文字
すべてのビットがゼロのバイトは、シフト状態に関係なくヌル文字として解釈されます。このようなバイトは、他のマルチバイト文字の一部としては発生しません。
6.2.6.2/1整数型
パディングビットの値は指定されていません。45)符号ビットがゼロである符号付き整数型の有効な(非トラップ)オブジェクト表現は、対応する符号なし型の有効なオブジェクト表現であり、同じ値を表すものとします。
任意の整数型の場合、すべてのビットがゼロであるオブジェクト表現は、その型の値ゼロの表現でなければなりません。
C ++ 11の場合(ISO / IEC 14882:2011)
2.3/3文字セット[lex.charset]
基本実行文字セットと基本実行ワイド文字セットには、それぞれ、基本ソース文字セットのすべてのメンバーに加えて、アラート、バックスペース、およびキャリッジリターンを表す制御文字に加えて、ヌル文字(それぞれヌルワイド文字)が含まれます。その表現はすべてゼロビットです。