4

C99 準拠の C では、プリプロセッサ マクロが定義されていないと仮定します。これは、符号なし整数の最大値を設定するより移植性の高い方法です。

unsigned x = -1;

また

unsigned y = ~0;

数年前、 unsigned intを設定すると、あいまいなシステムである種のトラップ表現-1があるため、より移植性が高いと主張するスレッドに出くわしたことを思い出します。しかし、それが真実であるとはもう確信が持てません。~0

符号なし変数に負の値を設定する動作が C99 標準 (つまり、モジュロ値など) で明確に定義されていることは知っていますが、? の反転は0どうですか?

さらに、両方の操作が同等に移植可能であり、コンパイラの最適化がないと仮定すると、どちらの操作がクロックサイクルの点でより効率的でしょうか?

4

3 に答える 3

6
#include <limits.h>

unsigned x = UINT_MAX;
于 2013-04-08T14:03:03.147 に答える
6

unsigned x = UINT_MAX;<limits.h>の定義により、動作します ( を含めた後) UINT_MAX

unsigned x = -1;演算が符号なし整数でどのように機能するかの定義によって機能します (UINT_MAX+1結果を表現可能にするために加算または減算されるため、which equals になり-1ます)。-1+UINT_MAX+1UINT_MAX

unsigned x = ~0;~は、数値の操作ではなく整数のビットの操作として定義されているため、動作が保証されていませんが、符号付き整数のビットは C 標準で完全に指定されていません。

unsigned x = ~0u;0uは符号なし整数であり、その値ビットは C 標準によって完全に指定されているため、動作します。

于 2013-04-08T14:08:01.960 に答える
3

最初、

unsigned x = -1;

よりポータブルです。適合するすべての実装でxtoの値を設定することが保証されています。UINT_MAX

二番目、

unsigned x = ~0;

は でビットごとの補数を行うため、 の値が であるintことが保証されません。1 の補数または符号と大きさのマシンではなく、トラップ表現である可能性さえあります。~0-1

代替手段

unsigned x = ~0u;

ゼロの補数を取り、unsigned完全に移植可能です。

于 2013-04-08T14:07:50.783 に答える