型変換:
低値から高値へ: 継続、最上位ビットの充填。
高値から低値へ: 切り捨て
ダイレクト キャストを使用しても、シンボルは削除されません。
同じ長さの変数間の型変換
同じ長さの異なる型が相互に変換される場合、たとえば、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 よりもはるかに大きくなります。