3

重複の可能性:
二項演算子の両側の符号が異なる場合、プロモーションルールはどのように機能しますか?

unsigned整数から整数にキャストするときsigned、変数のビットの表現が変化することを私は知っています。たとえば、からに変換すると、255は-1になる場合がありuint8ますint8。ただし、基になるビット自体に「キャスト」または「変換」が何を伴うのかはわかりませんでした。

私の質問は、整数変数の生のビットパターンは、static_cast符号付き型と符号なし型の間で同じままであることが保証されているのでしょうか、それとも何らかの方法でキャストによって変換される可能性があるのでしょうか。

好奇心からも、static_cast整数サイネージタイプ間でアセンブリが生成されますか、それともコンパイラが生成するasm命令を認識できるようにするためだけに使用されますか?

編集:

これが私が知りたいと思う種類のシナリオの例です:

unsigned int uintvar = random();
unsigned int control = uintvar;
assert(control == static_cast<unsigned int>(static_cast<signed int>(uintvar)));

ダブルキャストが最適化されるという事実を無視すると、この例は常に当てはまることが保証されますか?

4

2 に答える 2

8

ビットパターンはまったく変わりません(実際に遭遇する可能性のあるほとんどのアーキテクチャで)。違いは、値を操作するためにコンパイラーによって生成される命令にあります。

于 2013-01-21T22:16:47.540 に答える
4

符号なしの値が大きすぎて符号付きの値に収まらない場合、それは未定義の動作です。

これらのビットは2の補数で-1であるため、255は-1になります。ビットには何も起こりません。

于 2013-01-21T22:17:37.093 に答える