首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么"unsigned int“+ "unsigned int”返回"unsigned int"?

为什么"unsigned int“+ "unsigned int”返回"unsigned int"?
EN

Stack Overflow用户
提问于 2019-05-13 21:19:38
回答 4查看 251关注 0票数 0

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

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

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

EN

回答 4

Stack Overflow用户

发布于 2019-05-13 21:25:11

这将会带来真正的恶果:

您真的希望1+1成为long类型吗?(1 + 1) + (1 + 1)会成为long long类型吗?这将对类型系统造成严重破坏。

例如,shortintlonglong long的大小也可能相同,unsigned版本也是如此。

因此,隐式类型转换规则可能是最好的解决方案。

你可以通过类似这样的方式来解决这个问题。

代码语言:javascript
复制
0UL + "unsigned int" + "unsigned int"
票数 2
EN

Stack Overflow用户

发布于 2019-05-13 21:26:35

假设我们有一种语言,将两个整数相加得到一个更大的类型。因此,将两个32位数字相加得到一个64位数字。在下面的表达式中会发生什么?

代码语言:javascript
复制
auto x = a + b + c + d + e + f + g;

a + b为64位。a + b + c是128位。a + b + c + d是256位...这很快就会变得难以管理。大多数处理器不支持操作数这么宽的操作。

票数 2
EN

Stack Overflow用户

发布于 2019-05-13 21:30:30

变量的类型不仅决定了它可以容纳的值的范围,而且草率地说,还决定了操作是如何实现的。如果将两个unsigned值相加,则会得到unsigned结果。如果你想要一个不同的类型作为结果(例如long unsigned),你可以强制转换:

代码语言:javascript
复制
unsigned x = 42;
unsigned y = 42;
long unsigned z = static_cast<long unsigned>(x) + static_cast<long unsigned>(y);

实际上真正的原因是:它是这样定义的。特别是,无符号溢出在C++中被很好地定义为环绕,对于unsigned运算符的结果使用更宽的类型将打破这一行为。

作为一个人为设计的示例,请考虑以下循环:

代码语言:javascript
复制
for (unsigned i = i0; i != 0; ++i) {}

注意这个条件!让我们假设i0 > 0,那么当递增unsigned的最大值时,它只能是false,结果是0。这段代码被混淆了,可能会让您在代码审查中感到惊讶,尽管它是完全合法的。让结果类型根据结果的值进行调整,或者选择不会发生溢出的结果类型,都会破坏这种行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56113257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档