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;
的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位填充; 在这种情况下,a unsigned char将保持值0到32,767,并且int将保持从-32,767到+32,767的值.添加1 (unsigned char)32767确实是未定义的行为.char如果32,767被替换,任何更大的尺寸都可能出现类似的情况UCHAR_MAX.
然而,与在另一篇文章中提到的与无符号整数乘法相关的现实问题相比,这种情况不太可能.