1

C 標準は、ビット表現をどのように解釈すべきかを述べていますか? つまり、条件が常に true と評価される場合は、次のようにしますか? sizeof (int) = 4 および CHAR_BIT = 8 と仮定します。

unsigned u = 0xffffffff;
if (u == 4294967295) /* do something */

int i = 0xffffffff;
if (i == -1) /* do something */

unsigned u = (int)0xffffffff;
if (u == 0xffffffff) /* do something */

int i = hex_literal;
unsigned u;
memcpy (&u, &i, sizeof (u));
if (i == u) /* do something */
if ((i & 0x7fffffff) == (u & 0x7fffffff)) /* do something */

int i = hex_literal;
unsigned u = i;
if (i == u) /* do something */

unsigned u = hex_literal;
int i = u;
if (i == u) /* do something */

int i = hex_literal;
unsigned u = hex_literal;
if (i == hex_literal && u == hex_literal) /* do something */

char c = 0xff;
if (c >> 4 == 0xf) /* do something */

signed char c = 0xff;
if (((c >> 4) & 0xff) == 0xf) /* do something */
4

4 に答える 4

2

未署名の場合、はい。署名された型の場合、いいえ。標準では、2 の補数、1 の補数、または符号の大きさの表現が許可されています。標準 (C99) の関連セクションは 6.2.6.2 です。

別の問題は、 などのコードunsigned u = (int)0xffffffffが未定義の動作を呼び出すことです。これにより、整数オーバーフローが発生します (セクション 6.3.1.3)。

さらに別の問題は、 のようなコードがchar c = 0xff; c >> 42 つの理由で実装定義されていることです。まず、または のcharいずれsignedunsignedです。次に、それが の場合signed、負の数を右シフトすることは実装定義です (セクション 6.5.7)。

于 2011-10-27T14:04:23.407 に答える
1

符号なしの数値は、モジュロ 2^n 演算が保証されています。署名されたものにはそのような保証はありません。

ビットパターンについては何も言われていません。x0xfffffff は「ビット パターン」ではないことに注意してください。割り当てた 32 ビットの符号なし数値の場合、x + 1 = 0 を満たすことが保証されている数値 (「ビット パターン」は C++ 標準では意味を持ちません)です。 0xffffffff。

于 2011-10-27T14:03:29.527 に答える
0

覚えておくべき重要な項目は、16 進リテラル (例: ) は、ビットとバイトが物理的に格納される順序ではなく、(ここで0x0Fは ) を参照することです。15

これがどのように格納されるかはマシンに依存します-最下位ビットを最初に格納するものもあれば、上位ビットを最初に格納するものもあり、x86のAFAIKでは最下位バイトが最初ですが、上位ビットが最初です。

しかし、それは常に真であり、それは に0x000F等しい15.

于 2011-10-27T14:10:32.853 に答える