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

Vil*_*ray 5 c c99 undefined-behavior language-lawyer

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

例如,请使用以下代码:

#include <limits.h>

...

unsigned char x = UCHAR_MAX;
unsigned char y = x + 1;
Run Code Online (Sandbox Code Playgroud)

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,尽管是无符号整数类型,由于可能的有符号整数溢出会导致未定义的行为?

sup*_*cat 5

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

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