为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
眼眸繁星 2019-07-17 16:36:35
有符号整数溢出是否仍然是C+中未定义的行为?我们知道,有符号整数溢出是未定义的行为。..但是在C+11中有一些有趣的东西cstdint文件:带符号整数类型,宽度分别为8、16、32和64位,没有填充位和对负值使用2的补码(只有在实现直接支持类型时才提供)见链接这是我的问题:因为标准明确规定int8_t, int16_t, int32_t和int64_t负数是2的补码,这些类型的溢出是否仍是一种未定义的行为?编辑我检查了C+11和C11标准,下面是我发现的:C+11,第18.4.1节:标头定义了与C标准中的7.20相同的所有函数、类型和宏。C11,第7.20.1.1节:类型胡枝子名称intN_t指定带符号整数类型,其宽度为N,没有填充位,并指定两个补码表示形式。因此,int8_t表示这样一个带符号整数类型,宽度正好为8位。
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

我敢打赌。

来自标准文件(第4和第5页):

1.3.24未定义的行为

本国际标准不要求的行为

[注意:如果本国际标准遗漏了任何明确的行为定义,或者当程序使用错误的构造或错误的数据时,可能会出现未定义的行为。允许的未定义行为包括:完全忽略这种情况而导致不可预测的结果;在翻译或程序执行过程中以具有环境特征的记录方式(无论是否发布诊断消息);终止翻译或执行(通过发布诊断消息)。许多错误的程序构造不会产生未定义的行为;它们需要被诊断。


查看完整回答
反对 回复 2019-07-17
?
慕的地10843

TA贡献1785条经验 获得超8个赞

这些类型的溢出是否仍然是未定义的行为?

是。根据C+11标准第5/4段(关于一般的表述):

如果在计算表达式时,结果没有数学定义,或者不在其类型的可表示值范围内,行为未定义. [...]

对那些符号类型使用两个补码表示的事实并不意味着在计算这些类型的表达式时使用算术模2^n。

有关未签名另一方面,“标准”明确规定(第3.9.1/4段):

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

这意味着无符号算术运算的结果总是“数学定义“,结果总是在可代表的范围内;因此,5/4不适用。脚注46解释说:

46)这意味着未签名算术不会溢出,因为不能用结果无符号整数类型表示的结果将被减少,即大于结果无符号整数类型所能表示的最大值的数字。


查看完整回答
反对 回复 2019-07-17
  • 3 回答
  • 0 关注
  • 555 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信