0

C言語では、次の行を使用して、すべてのビットが 1 に設定された定数を定義するのはなぜですか?:

#define EXTENDED_MEM_END    ((unsigned) -1)

以下を使用する代わりに?:

#define EXTENDED_MEM_END    0xFFFFFFFF

それともこれだけ?:

#define EXTENDED_MEM_END    -1

移植性 (つまり、警告の回避)、非常に特殊なコード、および/またはその他の何かと関係がありますか?

CコードではEXTENDED_MEM_END識別子が に置き換えられる((unsigned) -1)ため、実際には正しい/期待される値を使用する方法であると思われます。

4

4 に答える 4

3
#define EXTENDED_MEM_END    0xFFFFFFFF

int が 32 ビットでない場合は正しくありません。

#define EXTENDED_MEM_END    -1

無署名ではありません。

于 2013-04-19T02:29:48.533 に答える
1

32 ビット マシンでは、64 個の 1 ビットを定義しようとするとオーバーフローし、警告が表示されますが、64 ビット マシンでは 32 個の 1 ビットのみを定義すると、間違った値が返されます。

((unsigned)-1)すべての状況で正しい結果が得られます (標準で要求されています)。

于 2013-04-19T02:28:23.123 に答える
1

または、 fromを使用UINT_MAX<limits.h>ます。これはポータブルになります。他の代替手段は、異なるアーキテクチャで((unsigned)-1)失敗します (非 2 の補数アーキテクチャで失敗します (実際にその問題が発生するわけではありません)) または0xffffffff(64 ビット アーキテクチャで0xffffffffffffffff失敗します) または (32 ビット アーキテクチャで失敗します)。

于 2013-04-19T03:00:50.323 に答える