如何根据操作数的类型决定结果的类型?

时间:2015-06-17 12:26:06

标签: c integer unsigned

如果我们有

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

表达的类型是什么

a + b;

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

3 个答案:

答案 0 :(得分:2)

有一组称为通常算术转换的规则,用于指定使用算术运算符时应用的转换。 (如果您在此处搜索该术语,则可以轻松找到完整列表)

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

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

答案 1 :(得分:0)

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

  a + b;

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

引用C11标准,章节§6.3.1.8

  

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

答案 2 :(得分:0)

表达的类型

a + b;

将是unsigned int

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

  

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

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

  

3否则,新类型已签名且值不可   代表其中;结果是实现定义的还是   实现定义的信号被提出

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