gpt4 book ai didi

c++ - 在溢出的情况下,i++ 是否会为小于 int 的有符号类型调用未定义的行为?

转载 作者:可可西里 更新时间:2023-11-01 18:37:34 26 4
gpt4 key购买 nike

很明显,由于算术溢出,以下代码调用了未定义的行为:

#include <limits.h>

int test(void) {
int i = INT_MAX;
i++; /* undefined behavior */
return i;
}

但是小于 int 的签名类型呢?例如 shortsigned char ? (更小的,我分别假设 SCHAR_MAX < INT_MAXSHRT_MAX < INT_MAX)。

下面哪个函数会调用未定义的行为,为什么?

signed char test2(void) {
signed char i = SCHAR_MAX;
i = i + 1; /* implementation defined */
return i;
}

signed char test3(void) {
signed char i = SCHAR_MAX;
i += 1; /* undefined behavior or implementation defined? */
return i;
}

signed char test4(void) {
signed char i = SCHAR_MAX;
i++; /* undefined behavior or implementation defined? */
return i;
}

signed char test5(void) {
signed char i = SCHAR_MAX;
++i; /* undefined behavior or implementation defined? */
return i;
}

请提供对 C 标准的引用或引用以支持您的推理。

最佳答案

+= 和类似的运算符直接对目标类型的值进行操作是合乎逻辑的,并且在许多实现上它们实际上就是这样做的。但是,该标准要求运算符的行为就像目的地的值经过任何适用的标准和平衡提升一样,然后处理指定的操作,然后转换回目的地类型。

因此,如果su是有符号和无符号的16位变量,int是32位的,那么s *=s; 将为 s 的所有值定义 [如果结果超过 32767,它必须产生一个实现定义的值或引发一个实现定义的信号;大多数实现都必须竭尽全力做除二进制补码缩减以外的任何事情]。另一方面,u*=u; 将只保证将 mod 65536 包装为 u 的值高达 46340;对于较大的值,它将调用未定义的行为。

关于c++ - 在溢出的情况下,i++ 是否会为小于 int 的有符号类型调用未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40343751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com