2

コード:

typedef signed   short  SIGNED_SHORT;   //16 bit
typedef signed   int    SIGNED_INT;     //32 bit


SIGNED_SHORT x;

x = (SIGNED_SHORT)(SIGNED_INT) 45512; //or any value over 32,767

これが私が知っていることです:

符号付き16ビット:
符号付き:-32,768〜32,767
符号なし:0〜65,535

16ビットの符号付き整数xとして宣言されているように、45512が収まるとは思わないでください。x

上記のダブルキャスティングはどのように、そして何をしますか?

ありがとう!

4

4 に答える 4

5

When you cast twice, the casts are applied in sequence.

int a = 45512;
int b = (int) a;
short x = (short) b;

Since 45512 does not fit in a short on most (but not all!) platforms, the cast overflows on those platforms. This will either raise an implementation-defined signal or result in an implementation-defined value.

In practice, many platforms define the result as the truncated value, which is -20024 in this case. However, there are platforms which raise a signal, which will probably terminate your program if uncaught.

Citation: n1525 §6.3.1.3

Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.

于 2012-08-15T00:19:16.350 に答える
5
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ビットを作成できます。しかし、私はあなたのコンパイラのサイズがあなたが述べている通りであると仮定します。intshortshortint

さらに、signed shortおよびは、およびとshort同じタイプの名前です。signed intint

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標準は、実装定義の信号を生成するためのそのような変換の許可を追加しました。これを行うコンパイラはありません。)

この種の変換の最も一般的なセマンティクスは、結果がソース値の下位ビットを取得することです。これにより、値がに割り当てられる可能性があります。ただし、プログラムの移植性を最大限に高めたい場合は、これに依存しないでください。-20024x

于 2012-08-15T00:26:08.360 に答える
4

The double casting is equivalent to:

short x = static_cast<short>(static_cast<int>(45512));

which is equivalent to:

short x = 45512;

which will likely wrap around so x equals -20024, but technically it's implementation defined behavior if a short has a maximum value less than 45512 on your platform. The literal 45512 is of type int.

于 2012-08-15T00:19:05.160 に答える
2

You can assume it does two type conversions (although signed int and int are only separated once in the C standard, IIRC).

If SIGNED_SHORT is too small to handle 45512, the result is either implementation-defined or an implementation-defined signal is raised. (In C++ only the former applies.)

于 2012-08-15T00:12:58.200 に答える