13

標準(4.7)から、intからunsigned intへの変換は、両方が同じビット数を使用する場合、純粋に概念的なもののように見えます。

宛先タイプが符号なしの場合、結果の値は、ソース整数と一致する最小の符号なし整数です(モジュロ2 n、nは符号なしタイプを表すために使用されるビット数)。[注:2の補数表現では、この変換は概念的なものであり、ビットパターンに変更はありません(切り捨てがない場合)。—エンドノート]

したがって、この方向では、変換によってビットマスクが保持されます。unsigned intからintへの変換について標準が同じことを保証しているかどうかはわかりません(ここでも、同じビット数が使用されていると仮定しています)。ここでの標準は次のように述べています。

宛先タイプが署名されている場合、宛先タイプ(およびビットフィールド幅)で表すことができれば、値は変更されません。それ以外の場合、値は実装によって定義されます。

ここでの「宛先タイプ」とは正確にはどういう意味ですか?たとえば、2^32-1は32ビット整数で表すことはできません。それは、宛先タイプで表現できないため、ビットパターンが同じままであると想定できないことを意味しますか?

4

3 に答える 3

4

intこの場合の宛先タイプです。あなたが言うように 2^32-1 は表現できないので、この場合は実装固有です。ただし、ビットパターンが保持されるのを見たことがあります。

編集: 組み込みの世界では、1 つのストレージの場所がビット単位で同一の複数の表現を必要とする場合にしばしばユニオンを使用することを追加する必要があります。

だからこの場合

union FOO {
    int32_t signedVal;
    uint32_t unsignedVal;
} var;

varvar.signedVal符号付き int として格納されているvar.unsignedVal32 ビットを取得し、符号なし値として格納されている32 ビットを取得するためにアクセスできます。この場合、ビットは保持されます。

于 2013-02-02T18:29:30.777 に答える
3

あなたは何も仮定することはできません。

最初の引用は、ビットマスクが同じままであるとは述べていません。2 の補数では同じかもしれませんが、1 の補数やその他の表現では同じではありません。

第二に、実装定義とは実装定義を意味し、一般的には何も想定できません。

理論的には、表現は変換ごとに完全に異なる可能性があります。それでおしまい。


現実的に見ると、物事はより具体的になります。通常、int は 2 の補数で格納され、signed->unsigned は unsigned->signed と同じようにパターンを保存します (値は実装で定義できるため、何もしないのが最も安価な方法です)。

于 2013-02-02T18:30:38.130 に答える
1

「宛先タイプ」とは、割り当て/キャストするタイプを指します。

段落全体は、32 ビットunsigned intに変換された 32 ビットsigned intが、値がsigned int. それらが適合しない場合、それが何をするかは実装に依存します (例: 切り捨て)。つまり、ビットが保持されるか変更されるかは実装に依存します (保証はありません)。

つまり、unsigned intがその最上位ビットを使用すると、結果は予測できなくなります。それ以外の場合、変更はありません (「箱の名前」を変更する以外は)。

于 2013-02-02T18:28:18.320 に答える