typedef signed short SIGNED_SHORT; //16 bit
typedef signed int SIGNED_INT; //32 bit
これらtypedef
は特に有用ではありません。typedefは、既存の型に新しい名前を提供するだけです。タイプsigned short
にはすでに完全に良い名前があります: " signed short
"; それを呼んでSIGNED_SHORT
も何も買わない。(タイプに関する情報を抽象化した場合、またはタイプが変更される可能性がある場合は意味がありますがSIGNED_SHORT
、それ以外のタイプの名前を使用するsigned short
と、非常に混乱します。)
short
また、とは両方とも少なくとも16ビット幅でint
あることが保証されており、少なくともと同じ幅ですが、異なるサイズが可能であることに注意してください。たとえば、コンパイラはと16ビットの両方を作成できます。つまり、64ビットを作成できます。しかし、私はあなたのコンパイラのサイズがあなたが述べている通りであると仮定します。int
short
short
int
さらに、signed short
およびは、およびとshort
同じタイプの名前です。signed int
int
SIGNED_SHORT x;
x = (SIGNED_SHORT)(SIGNED_INT) 45512; //or any value over 32,767
キャストは、指定されたタイプへの変換を指定します。2つのキャストは、そのような2つの変換を指定します。値45512
はに変換されsigned int
、次にに変換されsigned short
ます。
定数45512
はすでに型int
(の別名signed int
)であるため、最も内側のキャストはかなり無意味です。(int
が16ビットしかない場合は45512
、タイプになりlong
ます。)
ある数値型の値を別の数値型のオブジェクトに割り当てると、その値は暗黙的にオブジェクトの型に変換されるため、最も外側のキャストも冗長になります。
したがって、上記のコードスニペットは次とまったく同じです。
short x = 45512;
システムの範囲とint
システムshort
上で、数学的な値45512
をタイプで表すことはできませんshort
。言語規則では、このような変換の結果は実装によって定義されると規定されています。つまり、結果が何であるかを決定するのは各実装次第であり、その選択を文書化する必要がありますが、実装が異なれば異なる方法で実行できます。(実際、それは完全な話ではありません。1999ISO C標準は、実装定義の信号を生成するためのそのような変換の許可を追加しました。これを行うコンパイラはありません。)
この種の変換の最も一般的なセマンティクスは、結果がソース値の下位ビットを取得することです。これにより、値がに割り当てられる可能性があります。ただし、プログラムの移植性を最大限に高めたい場合は、これに依存しないでください。-20024
x