3

標準によると、char署名されているかどうかは実装定義です。これは私にいくつかの問題を引き起こしました。次にいくつかの例を示します。

1) 最上位ビットのテスト。が署名されている場合char、単純に値を と比較できます0。署名されていない場合は、代わりに値を比較します128。2 つの単純な方法はどちらも一般的ではなく、両方のケースに適用されます。移植可能なコードを書くためには、ビットを直接操作しなければならないようです。

2) 値の割り当て。値にビット パターンを書き込む必要がある場合がありcharます。が符号なしの場合char、これは 16 進表記を使用して簡単に実行できますchar c = 0xffcharただし、署名されている場合、この方法は適用されません。例を挙げてみましょうchar c = 0xff0xff署名済みが保持できる最大値を超えていますchar。このような場合、標準では、 の結果の値cは実装定義であると規定されています。

では、この 2 つの問題について何か良いアイデアをお持ちの方はいらっしゃいますか? 2つ目に関してはchar c = '\xff'、 signed と unsigned の両方でOKなのか気になりcharます。

注:明示的なビット パターンを文字に書き込む必要がある場合があります。http://en.cppreference.com/w/cpp/string/multibyte/mbsrtowcsの例を参照してください。

4

5 に答える 5

2

1) MSB のテスト: (x | 0x7F) != 0x7F(またはreinterpret_cast<unsigned char&>(x) & 0x80)

2)reinterpret_cast<unsigned char&>(x) = 0xFF;

reinterpret_cast文字が占有するメモリをビットのコレクションとして扱いたい場合は、これが完全に適切であり、型内の特定の値に関連付けられた特定のビット パターンをバイパスすることに注意してくださいchar

于 2015-03-26T03:01:19.397 に答える
1

signed char署名されているかどうかを本当に気にする場合は、変数をunsigned char必要に応じて宣言するだけです。プラットフォームに依存しないビット操作のトリックは必要ありません。

于 2015-03-26T03:05:15.243 に答える
0

指定された値を 2 つの0x7Fおよび0xFFそれぞれで OR および AND して、signed_ness を検出および削除することができます。

于 2015-03-26T02:56:51.257 に答える
0

実際には、署名を気にせずにやりたいことができます。

16 進数は、整数値ではなくビット パターンを表します。(免責事項を参照)

2.の場合、このようなビットパターンを割り当てることはできないと言いました

文字 c = 0xff

しかし、署名されているかどうかに関係なく、実際にそれを行うことができます。

1 の場合、「0 と比較する」トリックを実行できない場合がありますが、最上位ビットを確認する方法はいくつかあります。1 つの方法は、右に 7 をシフトし、左に 0 をシフトしてから、1 に等しいかどうかを確認することです。符号の有無とは無関係です。

Tony D が指摘したように、 (x | 0x7F) != 0x7F は、ゼロにシフトしない可能性があるため、シフトする代わりに移植性の高い方法です。同様に、x & 0x80 == 0x80 を実行できます。

もちろん、ブライアンが提案したことを実行して、unsigned char を使用することもできます。

免責事項: Tony は、0x は実際には int であり、char が値を保持できない場合、または char が unsigned である場合、char への変換は実装定義であると指摘しました。ただし、ここで標準を破る実装はありません。char c = 0xFF、天候または符号なしかどうか、ビットを埋めます、私を信じてください。それを行わない実装を見つけるのは非常に困難です。

于 2015-03-26T02:47:29.430 に答える
0

MSB をテストする最も簡単な方法は、LSB にすることですchar c = foo(); if ((c>>(CHAR_BIT-1)) & 1) ...

特定のビットパターンを設定するのは、もう少しトリッキーです。たとえば、全ビット 1 は、必ずしも 0xff であるとは限りませんが、0x7ff、またはより現実的には 0xffff である可能性もあります。とにかく、~char(0)オールビットワンです。やや明白ではありませんが、そうですchar(-1)。char が署名されている場合、それは明らかです。符号なしの場合、符号なしの型は 2^N を法として機能するため、これはまだ正しいです。そのロジックに従ってchar(-128)、char に含まれるビット数や符号付きかどうかに関係なく、8 ビットのみを設定します。

于 2015-03-26T09:43:12.627 に答える