[組み込み C] 強制型変換

型変換:
  低値から高値へ: 継続、最上位ビットの充填。
  高値から低値へ: 切り捨て
  ダイレクト キャストを使用しても、シンボルは削除されません。

同じ長さの変数間の型変換

同じ長さの異なる型が相互に変換される場合、たとえば、shortshort は強制的に unsigned shortunsigned short になります。実際、変換プロセス中、変換された unsigned shortunsigned short は、コンピューター内の元の shortshort のバイナリ表現と同じになります。変更されるのは、それらの解釈方法だけです。

キャストの結果、ビット値は変更されず、ビットの解釈方法が変更されるだけです。

short a = -4321;
unsigned short ua = (unsigned short)a;  //  这里进行强制类型转换 ua的真值是61215

異なる長さの変数間の型変換

長語長変数から短語長変数への変換

システムは余分な上位語長を直接切り捨て、下位部分を直接割り当てます。

u16 exmple = 1000 0000 1111 0000;
u8 res;
res = (u8)exmple;
//res的值就是1111 0000

短語長変数を長語長変数に変換する場合、上位部分も次のように展開されます。原数字的符号位

短語長が長語長に変わると、対応するビット値が等しいだけでなく、上位部分も元の数値の符号ビットに拡張されます。

負の数の処理

負の数に関する二項問題: 負の数を使用します补码原码 逆変換を行います反码。補数を追加すると、1 は 2 の補数になります。

たとえば、1 は 0000 0001 です
-1 の元のコード: 1000 0001
逆コード: 1111 1110< a i=3> 補数コード: 1111 1111 -1 を使用すると、1111 1111 になります。

次に、char 型の -1 を unsigned char に強制すると、結果は 1111 になります。1111 は 255 として解釈されます。

キャストの結果、ビット値は変更されず、ビットの解釈方法が変更されるだけです。

次に、char 型の -1 が強制的に unsigned unsigned short に変換されると、結果は 1111 1111 1111 1111 となり、65535 として解釈されます。

上位部分も元の数値の符号ビットに展開されます!

キャストを直接使用してもシンボルは削除されません

uint64 型に 10 進数値 2147483648 (0x8000 0000) を代入するコードでは int32 型が使用されており、int32 型のバイナリでは最上位ビットが 1 で補数として表現されます。 Int32 から uint64 型に値を代入する過程では、① int32 を int64 にアップグレードする、このとき余分な最上位ビットはすべて 1 で埋められ、0xffffffff80000000 になります、② この時点で int64 を uint64 に変換します、という 2 つのプロセスがあります。時間 10 進数値は 18446744071562067968 です。したがって、値は 2147483648 よりもはるかに大きくなります。

おすすめ

転載: blog.csdn.net/apythonlearner/article/details/133876041