整数转换排名和提升

ron*_*ino 4 c integer type-conversion

阅读有关整数提升和整数转换等级的信息,我找到了此链接

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

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

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

要点1 2 3完全清楚,但是我仍然没有给出案例4和5的示例。有人可以提供有关任何实现的示例吗?

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

_Bool <char <short <int <long <long long int

无论与类型相关的字节大小是相等还是更高。对?

关于升级或从一种类型转换为另一种类型。添加到最低类型零或1的位还是左极限位对此有影响?

我想知道位视图中的过程如何进行,尤其是对于转换。

对于整数促销,毫无疑问,它始终可以保留值和符号。

dbu*_*ush 6

如果您的无符号类型的等级小于与其操作的有符号类型的等级,并且它们的大小不同,则情况4适用。情况5则如果两者大小相同

例如,在我的系统上int是32位,long64位和long long64位。如果您具有以下条件:

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
Run Code Online (Sandbox Code Playgroud)

对于涉及的表达式ab,它们是unsigned intlong,任何有效的unsigned int可以适合在long。因此a被转换为long这种情况。

相反,对于包含c和的表达式,和dunsigned longlong long,a long long不能保存。的所有值unsigned long。因此,两个操作数都转换为unsigned long long

关于提升/转换在位级别上发生的情况,首先让我们假设低等级类型小于高等级类型,并且带符号类型使用2的补码表示形式。

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

  • 对于第二个示例,情况为3。“如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则可以看到***等于***,并且`unsigned long`和`long`具有相同的转换等级! (2认同)