无符号整数递增会导致未定义的定义行为吗?

时间:2014-11-18 21:46:58

标签: c language-lawyer c99 undefined-behavior

在阅读StackOverflow上的32 bit unsigned multiply on 64 bit causing undefined behavior?问题之后,我开始思考是否根据C99标准,对小型无符号类型的典型算术运算是否会导致未定义的行为。

例如,请使用以下代码:

#include <limits.h>

...

unsigned char x = UCHAR_MAX;
unsigned char y = x + 1;

x变量初始化为unsigned char数据类型的最大幅度。下一行是问题:值x + 1大于UCHAR_MAX,无法存储在unsigned char变量y中。

我相信以下是实际发生的事情。

  • 首先将变量x提升为数据类型int 6.3.1.1/2 部分),然后将x + 1评估为数据类型{{ 1}}。

假设存在intINT_MAX相同的实现 - UCHAR_MAX将导致有符号整数溢出。这是否意味着增加变量x + 1,尽管是无符号整数类型,但由于可能存在有符号整数溢出,会导致未定义的行为?

1 个答案:

答案 0 :(得分:5)

通过阅读标准,使用15位char的实现可以合法地将int存储为15位幅度,并使用第二个15位字来存储符号14位填充;在这种情况下,unsigned char将保持值0到32,767,int将保持值从-32,767到+32,767。向(unsigned char)32767添加1确实是未定义的行为。如果将32,767替换为char,则任何较大的UCHAR_MAX尺寸都可能出现类似情况。

然而,与其他帖子中提到的与无符号整数乘法相关的现实问题相比,这种情况不太可能。