【问题标题】:How the type of the result is decided based on type of operand?如何根据操作数的类型决定结果的类型?
【发布时间】:2015-09-02 16:30:30
【问题描述】:

如果我们有

   int a = 1;
   unsigned int b = -1;

表达式的类型是什么

a + b;

我可以使用 int 来存储结果吗?

【问题讨论】:

标签: c integer unsigned


【解决方案1】:

对于您的代码,“通常的算术转换”规则将适用于 + 运算符的操作数,因此,如果是

  a + b;

根据整数提升规则,a 将在添加之前提升为 unsigned int。结果也将是unsigned int 类型。

引用C11 标准,第 §6.3.1.8 章

..[..]... 否则,如果具有无符号整数类型的操作数的秩大于或 等于另一个操作数的类型的等级,然后操作数与 有符号整数类型转换为无符号操作数的类型 整数类型。

【讨论】:

    【解决方案2】:

    有一组称为常用算术转换的规则指定了在使用算术运算符时应用的转换。 (如果您在这里搜索该术语,您会很容易找到完整列表)

    在这种情况下,int 被提升为unsigned int,保留值1,因此加法的结果被明确定义为(unsigned int)0

    由于该值不大于INT_MAX,您可以将其存储在int 中。

    【讨论】:

      【解决方案3】:

      表达式的类型

      a + b;
      

      将是unsigned int

      根据 C 标准)6.3.1.8 常用算术转换)

      2...否则,两个操作数都转换为有符号整数类型的操作数类型对应的无符号整数类型

      至于将无符号类型的对象分配给与您的示例具有相同等级的有符号类型的对象,那么(C标准,6.3.1.3有符号和无符号整数)id有符号整数类型的对象不能表示然后是无符号整数类型对象的值

      3 否则,新类型有符号,值不能 代表其中;结果是实现定义的或 引发实现定义的信号

      如果值可以由签名对象表示,则它在签名对象中保持不变。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-24
        相关资源
        最近更新 更多