2016-05-11 11 views
0
int8 a = <some value>; 
int16 b = <some value>; 
a |= b; 
  • この例のための定義された動作とは何ですか?
  • aは16ビット整数としてスレッド化されますか?
  • bは8個の最上位ビットを削除しますか?
  • どちらもレジスタサイズを使用し、割り当てられない最上位ビットをすべてドロップしますか?
  • これは未定義の動作ですか?同様にint8_tint16_t両方がintより低い変換ランクを持っている最も一般的なシステム†(私が今まで使用してきたすべて)、

答えて

2

、両方のオペランドが、後者に昇格されます。

そして、operator |=がこれら2つ(一般的に32ビット)int Sで動作し、最後のステップで、得intint8_tに変換されます。結果がint8_tに収まらない場合、aの値は実装定義です。通常、それはちょうど余分なビットを落とします。†


intは、少なくとも16ビットとlong少なくとも32ビットであるので、あなたが使うタイプのどちらもintより大きいランクを持つことができるよう実は、それはすべてのシステムで保持しています。

3

ここでは積極的なプロモーションが行われます。 uint8_tint、さらにuint16_tの値に昇格され、uint8_tに変換されます。

+0

「uint16_t」の値は、符号付き16ビットintに昇格されたときに符号を変更しませんか、それとも積極的昇進では変化しませんか? – Broxzier

+0

@Broxzier 'int'が16bit以上であれば値は変更されません(16bit以上のすべての16bitが2の補数で表現できるので、' int'が16bit(C++標準では最低限必要) unsigned intに変換されます。 – SergeyA

関連する問題