我试图在 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。那是对的吗?
但是,该标准似乎没有说明任何内容。真的吗?如果是这样,那是为什么?