为什么“ unsigned int” +“ unsigned int”返回一个“ unsigned int”?

时间:2019-05-13 13:19:38

标签: c++ types

我相信,当您将两个unsigned int值加在一起时,返回值的数据类型将是unsigned int

但是两个unsigned int值相加可能会返回一个大于unsigned int的值。

那么为什么unsigned int + unsigned int返回unsigned int而不返回其他较大的数据类型?

4 个答案:

答案 0 :(得分:2)

这将带来真正的恶果:

您真的会想要1 + 1成为long类型吗?并且(1 + 1) + (1 + 1)会变成long long类型吗?它将对类型系统造成严重破坏。

例如shortintlonglong 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不能等于浮点数,因为它不具有浮点数的属性。 希望这能再回答您的问题!