首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪的整数溢出逻辑

奇怪的整数溢出逻辑
EN

Stack Overflow用户
提问于 2013-04-05 20:44:15
回答 5查看 159关注 0票数 1

对于下面的代码,我得到了一个溢出,但不幸的是,我似乎不能理解为什么。

代码语言:javascript
运行
复制
std::int8_t smallValue         = -1;
unsigned int value             = 500;
std::uint8_t anotherSmallValue = 1;

auto test = smallValue * value * anotherSmallValue;

之后,test是一个相当大的值。

有人能解释一下,这里发生了什么吗?

EN

Stack Overflow用户

回答已采纳

发布于 2013-04-05 20:57:29

当编译器看到smallValue * value时,它必须在给定输入数据类型signed (8位)和unsigned int (通常是16位或32位)的情况下决定结果的数据类型。C++的规则规定,在这种情况下,结果将是无符号的。因此,smallValue * value的值不能像您预期的那样为-500;相反,值-500被解释为正数。

此外,您在这里将一个8位值乘以一个通常为16位或32位的值。此场景中的C++规则规定,较小的存储值将首先转换为与较大的存储值相同的大小;因此,在这种情况下,smallValue * value的结果将确实足够大,以存储大量的幅度500

继续乘以无符号数量anotherSmallValue (=1)会得到另一个具有相同值的unsigned

因为您使用的是auto,所以返回类型被推断为unsigned

通过简单地转换回signed (例如,通过将值test定义为int,而不是auto ),通常会将整个操作的结果转换回signed值,而不会在内部更改位;这将正确地显示-500,正如您所预期的那样;然而,正如其他发帖者所指出的,这在理论上是相当危险的,因为它在技术上不能保证工作,尽管它通常会以这种方式在当今的编译器中工作。

票数 5
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15834326

复制
相关文章

相似问题

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