暗黙のキャストがC ++式で起こるのはどのポイントで起こりますか?
-
23-12-2019 - |
質問
これは非常に簡単な質問です。MSVS2012でコンパイルされたときに、0x3412
のval
の em>結果が生成されると、次のことが注目されています。
.
unsigned char test[] = { 0x12, 0x34, 0x56, 0x78 };
unsigned char* ch = test;
unsigned int val = *ch | (*(ch+1) << 8);
iは、右側の参照されたChar Pointer *(ch+1)
が0x34
の CHAR 値を生成する予定だと予想されます。値が間接参照される時点で、それは少なくとも2バイトを含むのに十分な大きさのタイプにすでに格納されているようです。
は、 C ++ 規格のどこかで指定されていますか?この暗黙のキャストがどのように起こるのか?
解決
これはドラフトC ++規格でカバーされていますセクション5.8
Shift演算子 1 1 これは次のとおりです。
[...]オペランドは、一体的または非焦点の列挙型であり、不可欠なプロモーションが行われます。[...]
および一体性促進は、 1 em> 1
を述べる断面4.5
で覆われている。
integer変換ランク(4.13)がintのランクより小さいBOOL、CHAR16_T、CHAR32_T、またはWCHAR_T以外の整数型の整数型は、INTのすべての値を表す場合はINT型のPRVALUEに変換できます。ソースタイプそれ以外の場合、ソースPRVALUEはunsigned int型のPRVALUEに変換できます。
所属していません StackOverflow