整数转换排名和促销

时间:2016-08-09 15:16:53

标签: c integer type-conversion

阅读整数提升和整数转换排名,我发现这个link

  
      
  • 1.如果两个操作数具有相同的类型,则不需要进一步转换。
  •   
  • 2.否则,如果两个操作数都有有符号整数类型或两者都有无符号整数类型,则操作数的类型为小整数   转换等级转换为具有更大的操作数的类型   秩。
  •   
  • 3.否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则   带有符号整数类型的操作数转换为   带无符号整数类型的操作数。

  •   
  • 4.否则,如果带有符号整数类型的操作数的类型可以表示带有无符号的操作数类型的所有值   整数类型,然后转换具有无符号整数类型的操作数   带有符号整数类型的操作数的类型。

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

  •   

要点1 2 3完全清楚,但我仍然没有提出案例4和5的例子。有人可以提供一个关于任何实施的例子吗?

据我所知,整数转换等级为:

_Bool< char<简短< int<长< long long int

与类型相关的字节大小是相等还是更高。正确?

关于从一种类型到另一种类型的促销或转换。添加到最低类型0或1或左极端位的位是否会对此产生影响?

我想知道位视图中的过程如何,特别是转换过程。

对于整数提升,它可以毫无疑问地保存值和符号。

1 个答案:

答案 0 :(得分:5)

如果您的无符号类型的排名小于其使用的签名类型并且大小不同,则情况4适用。情况5然后两个是相同的大小

例如,在我的系统int上是32位,long是64位,long long是64位。如果您有以下内容:

unsigned int a;      // range: 0 to 4294967295
long b;              // range: -9223372036854775808 to 9223372036854775807

unsigned long c;     // range: 0 to 18446744073709551615
long long d;         // range: -9223372036854775808 to 9223372036854775807

对于涉及ab unsigned intlong的表达式,任何有效的unsigned int都可以放在long中。因此,在这种情况下,a会转换为long

相反,对于涉及cd unsigned longlong long的表达式,long long无法保存{{1}的所有值}}。因此,两个操作数都转换为unsigned long

关于在比特级别的促销/转换期间发生的事情,让我们首先假设较低等级类型小于较高等级类型,并且有符号类型使用2的补码表示。

对于从32位unsigned long long到64位int的转换,如果值为正,则在左侧添加包含全0位的4个字节。如果值为负,则在左侧添加包含全1位的4个字节。例如,值long的表示形式从5更改为0x00000005。对于值0x0000000000000005,表示形式从-5更改为0xfffffffb