整数提升在c ++中未签名

Pra*_*een 2 c++ unsigned-integer

int main() {
    unsigned i = 5;
    int j = -10; 
    double d = i + j;
    long l = i + j;
    int k = i + j;
    std::cout << d << "\n";     //4.29497e+09
    std::cout << l << "\n";     //4294967291
    std::cout << k << "\n";     //-5
    std::cout << i + j << "\n"; //4294967291
}
Run Code Online (Sandbox Code Playgroud)

我相信在做算术运算符之前会signed int被提升unsigned.
虽然-10转换为无符号unsigned integer underflow(这是正确的术语??)将发生,并在添加后打印4294967291.

为什么在int k打印的情况下不会发生这种情况-5

M.M*_*M.M 6

执行算术运算符的过程涉及转换以使两个值具有相同的类型.这个过程的名称是找到普通型,以及用于的情况下intunsigned int,所述转换被称为通常的算术转换.术语推广未在此特定情况下使用.

在的情况下i + j,将int被转换为unsigned int,通过添加UINT_MAX + 1到它.因此,结果i + jUINT_MAX - 4,在您的系统上4294967291.

然后,您将此值存储在各种数据类型中; 唯一需要进一步解释的输出是k.该值UINT_MAX - 4无法适应int.这称为超出范围的赋值,结果值是实现定义的.在您的系统上,它显然分配了与int值具有相同表示的unsigned int值.