我相信,当您将两个unsigned int
值加在一起时,返回值的数据类型将是unsigned int
。
但是两个unsigned int
值相加可能会返回一个大于unsigned int
的值。
那么为什么unsigned int
+ unsigned int
返回unsigned int
而不返回其他较大的数据类型?
答案 0 :(得分:2)
这将带来真正的恶果:
您真的会想要1 + 1成为long
类型吗?并且(1 + 1) + (1 + 1)
会变成long long
类型吗?它将对类型系统造成严重破坏。
例如short
,int
,long
和long long
的大小也可能相同,而unsigned
的大小相似版本。
因此,隐式类型转换规则可能是最好的解决方案。
您总是可以用类似的方式强制问题
0UL + "unsigned int" + "unsigned int"
答案 1 :(得分:2)
让我们想象一下,我们有一种语言,将两个整数相加会导致一个更大的类型。因此,将两个32位数字相加会得到一个64位数字。以下表达式在表达式中会发生什么?
auto x = a + b + c + d + e + f + g;
a + b
是64位。 a + b + c
是128位。 a + b + c + d
是256位...这变得非常难以管理。大多数处理器不支持如此宽的操作数。
答案 2 :(得分:2)
变量的类型不仅决定了它可以保存的值的范围,而且草率地说,还决定了如何实现这些操作。如果您添加两个unsigned
值,则会得到unsigned
的结果。如果您要使用其他类型的结果(例如long unsigned
),则可以进行强制转换:
unsigned x = 42;
unsigned y = 42;
long unsigned z = static_cast<long unsigned>(x) + static_cast<long unsigned>(y);
实际上,真正的原因是:这样定义。特别是,无符号溢出在C ++中得到了很好的定义,可以环绕并为unsigned
运算符的结果使用更广泛的类型将破坏该行为。
作为一个人为的示例,请考虑以下循环:
for (unsigned i = i0; i != 0; ++i) {}
注意条件!让我们假设i0 > 0
,那么当将unsigned
的最大值增加0
的结果时,它永远只能是错误的。这段代码被混淆了,尽管它是完全合法的,但应该使您在代码审查中扬眉吐气。根据结果的值调整结果类型,或选择不会发生溢出的结果类型,将破坏此行为。
答案 3 :(得分:-3)
因为一个变量+一个相同类型的变量只能等于该类型变量, (嗯,在某些情况下会,但在您的情况下不会)
示例:
int + int = int一个int加另一个int不能等于浮点数,因为它不具有浮点数的属性。 希望这能再回答您的问题!