在阅读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}}。假设存在int
和INT_MAX
相同的实现 - UCHAR_MAX
将导致有符号整数溢出。这是否意味着增加变量x + 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
尺寸都可能出现类似情况。
然而,与其他帖子中提到的与无符号整数乘法相关的现实问题相比,这种情况不太可能。