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

在64位读取32位无符号乘法后导致未定义的行为? 问题在StackOverflow上,我开始思考根据C99标准,对小型无符号类型的典型算术运算是否会导致未定义的行为。

例如,请使用以下代码:

#include  ... 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被计算为数据类型int

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

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

然而,与在另一篇文章中提到的与无符号整数乘法相关的现实问题相比,这种情况不太可能。