c ++内部类型之间的隐式类型转换

时间:2012-12-22 16:08:56

标签: c++ type-conversion

在内部类型的C ++二元运算符中,两个操作数应该具有相同的类型,否则,其中一个操作数将根据层次结构转换为另一个操作数的类型:

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

我的问题是:为什么unsigned T的级别高于T。它只是一个随意的选择,或者将T转换为Unsigned 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比其他方式更有优势。

2 个答案:

答案 0 :(得分:4)

它基本上是一个可以选择的选择,可以追溯到C的早期。

据我所知,在预标准K&amp; RC中,规则基本上是如果运算符的操作数具有无符号类型,则结果也将是无符号的(这称为无符号保留)。 / p>

当C标准化时,此规则已更改为C和C ++当前使用的规则,只要该值可以在目标类型中表示(这称为值 - 保存)。原因是新规则在进行混合有符号/无符号算术时为不知情的程序员提供了更少的惊喜。

Tunsigned T的转换可以有两种解释:

  1. 这是旧的(未签名的保留)规则的保留。
  2. 对于像unsigned long long这样的东西,不需要大于1ULL > -1LL的类型是唯一理智的事情,因为签名到无符号转换总是被定义(凭借包装 - 围绕无符号整数的特征),但反向转换不是。

答案 1 :(得分:0)

我猜测逻辑是int的实际大小比unsigned int小1位,因为MSB用于符号。因此,有符号变量的绝对值范围是无符号变量的范围的一半。