我相信当您将两个unsigned int值相加时,返回值的数据类型将是unsigned int。
但是,将两个unsigned int值相加可能会返回一个大于unsigned int的值。
那么为什么unsigned int + unsigned int返回unsigned int而不是其他更大的数据类型呢?
发布于 2019-05-13 21:25:11
这将会带来真正的恶果:
您真的希望1+1成为long类型吗?(1 + 1) + (1 + 1)会成为long long类型吗?这将对类型系统造成严重破坏。
例如,short、int、long和long long的大小也可能相同,unsigned版本也是如此。
因此,隐式类型转换规则可能是最好的解决方案。
你可以通过类似这样的方式来解决这个问题。
0UL + "unsigned int" + "unsigned int"发布于 2019-05-13 21:26:35
假设我们有一种语言,将两个整数相加得到一个更大的类型。因此,将两个32位数字相加得到一个64位数字。在下面的表达式中会发生什么?
auto x = a + b + c + d + e + f + g;a + b为64位。a + b + c是128位。a + b + c + d是256位...这很快就会变得难以管理。大多数处理器不支持操作数这么宽的操作。
发布于 2019-05-13 21:30:30
变量的类型不仅决定了它可以容纳的值的范围,而且草率地说,还决定了操作是如何实现的。如果将两个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的最大值时,它只能是false,结果是0。这段代码被混淆了,可能会让您在代码审查中感到惊讶,尽管它是完全合法的。让结果类型根据结果的值进行调整,或者选择不会发生溢出的结果类型,都会破坏这种行为。
https://stackoverflow.com/questions/56113257
复制相似问题