C++中的整数提升无符号。

4
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
}

我认为在执行算术运算符之前,signed int会被升级为unsigned
-10被转换为无符号数时,unsigned integer underflow将发生(这个术语正确吗?),加法后打印出4294967291

为什么int k的情况没有发生,它打印了-5

2个回答

9
进行算术运算的过程涉及到一种转换,使两个值具有相同的类型。这个过程被称为找到“通用类型”,对于intunsigned int的情况,这些转换被称为常规算术转换。在这种特定情况下,不使用提升这个术语。
i + j的情况下,将int转换为unsigned int,通过将UINT_MAX + 1加到它上面。因此,i + j的结果是UINT_MAX - 4,在您的系统上是4294967291
你随后将这个值存储在各种数据类型中;唯一需要进一步解释的输出是k。 值UINT_MAX - 4无法适应int。 这称为超出范围赋值,并且生成的值是实现定义的。 在您的系统上,它显然分配了与unsigned int值具有相同表示的int值。

1

j 在加法运算之前会被转换为 unsigned int,这在所有的 i + j 中都会发生。进行一个快速实验。

int k = i + j 的情况下。与你和我的实现一样,i + j 产生了:42949672914294967291 大于 std::numeric_limits<int>::max(),行为将是实现定义的。为什么不尝试将 4294967291 分配给一个 int

#include <iostream>

int main(){
    int k = 4294967291;
    std::cout << k << std::endl;
}

产生:

-5

如下所示 这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接