int
的签名溢出是未定义的行为:
int a = INT_MAX;
a += 1; // Undefined Behavior
short
的相同操作由实现定义(如果short
小于int
):
short a = SHRT_MAX;
a += 1; // Implementation defined
这是实现定义的,因为首先将a
提升为int
(通常比short
宽得多的类型),然后将结果转换为{{1} }(由实现定义),如果该值不能用short
表示。
我对吗?如果是,为什么会有区别?两者都是未定义的行为或实现定义是否合乎逻辑?