无符号整数递增会导致未定义的定义行为吗?
在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_MAX
和UCHAR_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
大小都可能出现类似的情况。
然而,与在另一篇文章中提到的与无符号整数乘法相关的现实问题相比,这种情况不太可能。