C中类型之间的转换

时间:2012-11-14 01:57:35

标签: c types operators unsigned signed

我知道只要操作符在两个具有不同类型的操作数上使用,结果类型就是两个操作数之间的“显性”类型。
例如,结果为 (int) + (float)
将是一个浮动。
另一个例子是:
(char) + (double) 结果是双倍的。

对于有符号变量和仅有符号变量,这是正确的。

但是当我们将带有无符号变量的带符号变量包含在内时会发生什么?

1 个答案:

答案 0 :(得分:4)

详情见C11,6.3.1.8。总结一下:

  • 如果无符号类型等于或宽,则签名类型将转换为无符号类型。

  • 否则,如果签名类型可以包含无符号类型的所有值,则无符号类型将转换为有符号类型。

  • 否则,两者都会转换为与签名类型对应的无符号版本。

“更宽”是指“转化率更高”。

示例(在某些特定架构上,例如sizeof(short) == 2sizeof(long) == sizeof(unsigned int) = 4):

int + unsigned int     => unsigned int  (first rule, equal rank)

long + unsigned short  => long          (second rule, long contains u. short)

long + unsigned int    => unsigned long (third rule)