c++ - C++中的无符号整数提升

标签 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
}

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

为什么打印 -5int k 没有发生这种情况?

最佳答案

执行算术运算符的过程涉及使两个值具有相同类型的转换。此过程的名称是查找常见类型,对于 int 的情况和 unsigned int ,转换称为 usual arithmetic conversions .术语promotion在这种特殊情况下不使用。

i + j的情况下, int转换为 unsigned int , 通过添加 UINT_MAX + 1给它。所以 i + j 的结果是UINT_MAX - 4 ,在您的系统上是 4294967291 .

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

关于c++ - C++中的无符号整数提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42200610/

相关文章:

c++ - 全局变量外部声明后的 Threadprivate 指令

c++ - 从外部使用 "class::func()"调用非静态函数或构造函数

c++ - 覆盖现有的已使用集群

python - uint8 小端数组到 uint16 大端

c++ - 无符号用户定义整数文字

用于指定任何无符号整数类型的 C++ 模板特征

c++ - 为什么我的代码对于形状 "rectangle"处于无限循环中?

c++ - STL容器迭代器和C指针迭代器有什么区别

c - 我的 find-biggest-number 递归函数返回一个递减值

c# - var 如何处理数字?