我试图在 C++ 中解决整数提升和溢出问题。我对以下几点感到有些困惑:
a)如果我有以下代码段:
int i = -15;
unsigned j = 10;
std::cout << i + j;
我出去-5 % UINT_MAX
。这是因为表达式i + j
自动提升为无符号吗?我试图阅读标准(4.13):
— The rank of any unsigned integer type shall equal the rank of the corresponding signed integer type.
我不确定我是否读错了,但如果这是真的,为什么会i + j
以未签名的形式结束?
b)添加到上一个部分,我现在有:
int k = j + i;
那正在被评估为-5
. j + i
不应该先评估表达式,4294967291
在我的系统上给出,然后将其设置为 j 吗?那应该超出范围,那么这种行为是否未定义?我不确定我为什么会得到-5
.
c)如果我从a)稍微使用更改段short
,我有:
short i = -15;
unsigned short j = 10;
std::cout << i + j;
我想当我这样做时,我会得到与a)相同的结果,只是使用-5 % USHRT_MAX
. 但是,当我执行此操作时,我得到-5
. 为什么 usingshort
给出的值与 不同int
?
d)我一直了解到有符号积分的溢出行为是未定义的。例如:int r = ++INT_MAX
将是未定义的。
但是,如果存在无符号溢出,则将定义数量。例如:unsigned a = ++UINT_MAX
, 那么 a 就是0
。那是对的吗?
但是,该标准似乎没有说明任何内容。真的吗?如果是这样,那是为什么?