1

組み込み型の C++ 二項演算子では、両方のオペランドが同じ型を持つ必要があります。そうでない場合、階層に基づいてオペランドの 1 つが他のオペランドの型に変換されます。

long double
double
float
unsigned long long int
long long int
unsigned long int
long int
unsigned int
int

私の質問は次unsigned TのとおりですT。それは単なる恣意的な選択ですか、それとも変換することにはいくつかの利点がありTUnsigned Tその逆ではありません.

アップデート:

//where `unsigned int` to `int` work better.
int a=-3;
unsigned int b=3;
cout << a+b; /* this will output the right result if b get converted to int,
which is not what really happen.*/

//where `int` to `unsigned int` work better.
int a=3;
unsigned int b=pow(2,20);
cout << a+b; /* this will output the right result if a get converted to unsigned int,
which is fortunately what really happen.*/

ですから、会話TすることUnsigned Tが他の方法よりも多くの利点があるとは思いません。

4

2 に答える 2

4

それは本質的にCの初期にさかのぼる恣意的な選択です。

私が判断できる限り、先行標準のK&R Cでは、基本的に、演算子のオペランドが符号なしの型である場合、結果も符号なしになるという規則がありました(これは符号なし保存と呼ばれます)。

Cが標準化されると、このルールはCとC ++の両方で現在使用されているルールに変更されました。これにより、値をターゲットタイプで表すことができる限り、unsignedプロパティを削除できます(これは値保存と呼ばれます)。その理由は、新しいルールは、符号付き/符号なしの混合演算を実行するときに、疑いを持たないプログラマーに与える驚きが少ないためです。

Tからへの変換には、次のunsigned T2つの解釈があります。

  1. これは、古い(署名されていない保存)ルールからの引き継ぎです。
  2. 符号付きから符号なしへの変換は常に定義されているため(符号なし整数のラップアラウンド機能により)、次のunsigned long longようなものよりも大きい型を必要としないのは正しいことだけですが、逆変換はそうではありません1ULL > -1LL
于 2012-12-22T16:43:24.747 に答える
0

MSBが符号に使用されるため、の実際のサイズはのintよりも1ビット小さいという論理があると思います。unsigned intしたがって、符号付き変数の絶対値の範囲は、符号なし変数の範囲の半分です。

于 2012-12-22T16:14:14.017 に答える