【问题标题】:Integer promotion unsigned in c++C ++中无符号整数提升
【发布时间】:2017-07-01 05:38:39
【问题描述】:
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没有发生这种情况?

【问题讨论】:

    标签: c++ unsigned-integer


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      j 将在添加之前转换unsigned int,这发生在您所有的i + j 中。一个快速的实验。

      int k = i + j的情况下。就像你和我的实现一样,i + j 产生:42949672914294967291 大于 std::numeric_limits&lt;int&gt;::max(),行为将由实现定义。为什么不尝试将4294967291 分配给int

      #include <iostream>
      
      int main(){
          int k = 4294967291;
          std::cout << k << std::endl;
      }
      

      生产:

      -5
      

      如所见Here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-04
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 2018-08-18
        • 1970-01-01
        相关资源
        最近更新 更多