在内部类型的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
比其他方式更有优势。
答案 0 :(得分:4)
它基本上是一个可以选择的选择,可以追溯到C的早期。
据我所知,在预标准K&amp; RC中,规则基本上是如果运算符的操作数具有无符号类型,则结果也将是无符号的(这称为无符号保留)。 / p>
当C标准化时,此规则已更改为C和C ++当前使用的规则,只要该值可以在目标类型中表示(这称为值 - 保存)。原因是新规则在进行混合有符号/无符号算术时为不知情的程序员提供了更少的惊喜。
从T
到unsigned T
的转换可以有两种解释:
unsigned long long
这样的东西,不需要大于1ULL > -1LL
的类型是唯一理智的事情,因为签名到无符号转换总是被定义(凭借包装 - 围绕无符号整数的特征),但反向转换不是。答案 1 :(得分:0)
我猜测逻辑是int
的实际大小比unsigned int
小1位,因为MSB用于符号。因此,有符号变量的绝对值范围是无符号变量的范围的一半。