首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中有符号整数溢出仍然是未定义的行为?

在C++中有符号整数溢出仍然是未定义的行为?
EN

Stack Overflow用户
提问于 2018-04-16 08:06:56
回答 2查看 0关注 0票数 0

在C ++ 11 cstdint文档中有一些有趣的地方:

有符号整数类型,其宽度分别为8,16,32和64位,分别没有填充位,使用2的补码作为负值(仅当实现直接支持该类型时才提供)

由于标准明确地说,对int8_tint16_tint32_tint64_t负数是2的补码,他们还是未定义的行为吗?

EN

回答 2

Stack Overflow用户

发布于 2018-04-16 16:37:13

他们还是未定义的行为吗?

是。根据C++ 11标准:

如果在评估表达式时,结果不是数学上定义的,或者不在其类型的可表示值范围内,则行为是未定义的。[...]

对这些有符号类型使用二进制补码表示的事实并不意味着在评估这些类型的表达式时使用算术模2^n。

另一方面,关于无符号算术,标准明确规定:

无符号整数,声明unsigned应服从算术模2 ^ n的定律,其中n是特定大小整数的值表示中的位数

这意味着无符号算术运算的结果总是“ 数学定义的 ”。

票数 0
EN

Stack Overflow用户

发布于 2018-04-16 17:47:07

仅仅因为一个类型被定义为使用二进制补码表示法,它并不遵循该类型中的算术溢出变得定义。

有符号算术溢出的未定义行为用于启用优化; 例如,编译器可以假设,如果a > b的话a + 1 > b; 这不适用于无符号算术,因为a + 1会绕回到第二次检查,因此需要执行第二次检查0

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

https://stackoverflow.com/questions/-100008123

复制
相关文章

相似问题

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