このテーマに関する情報を簡単に理解できる方法で見つけるのはかなり困難だったので、見つけたもののレビューを求めています。それはすべて変換と変換のみです。
例では、次のことを参照します。
(signed/unsigned) int bigger;
(signed/unsigned) char smaller;
整数の切り捨て。(大きい→小さい)
- サイズに合わせて最初にMSB側を切り捨てます。
bigger
smaller
- 次に、小さい型に応じて、切り捨てられた結果を符号付き/符号なしに変換します。
大きい値が大きすぎて小さい型に収まらない場合、未定義の動作が発生します (これについては訂正してください)。ただし、私のルールはすべてのマシンで機能する必要があり (それについても訂正してください)、結果は予測可能である必要があります。- サイズに合わせて最初にMSB側を切り捨てます。
整数の拡大(小さい -> 大きい)
a)
signed char
->signed int
- 大きい方のサイズに合わせて小さい方に MSB (1 または 0) を付加します
- 署名付きに変換
b)
signed char
->unsigned int
- 小さい方の先頭に MSB (1 または 0) を追加して、大きい方のサイズに合わせます。
- 無署名に変換
c)
unsigned char
->signed int
- 大きいサイズに合わせて先頭に 0 を追加
- 署名付きに変換
d)
unsigned char
->unsigned int
- 大きいサイズに合わせて先頭に 0 を追加
- 無署名に変換
私が言及しなかった未定義/未指定の動作がポップアップする可能性があるのはどこですか?