整数转换排名和促销
阅读整数提升和整数转换排名我找到了这个链接
- 1.如果两个操作数具有相同的类型,则不需要进一步转换。
- 2.否则,如果两个操作数都有有符号整数类型或两者都有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型。
3.否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。
4.否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型。
5.否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型。
积分1 2 3完全清楚,但我仍然没有提出案例4和5的例子。有人可以提供一个关于任何实施的例子吗?
据我所知,整数转换等级是:
_Bool <char <short <int <long <long long int
无论与类型相关的字节大小是相等还是更高。 对?
关于从一种类型到另一种类型的促销或转换。 添加到最低类型为零或1或左极端位的位是否会对此产生影响?
我想知道位视图中的进程如何特别是对于转换。
对于整数提升,它可以毫无疑问地保存值和符号。
如果您的无符号类型的级别小于它正在使用的签名类型并且它们具有不同的大小 ,则情况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
对于涉及a
和b
的表达式,它们是unsigned int
和long
,任何有效的unsigned int
都可以适合long
。 所以a
在这种情况下转换为long
。
相反,对于涉及c
和d
的表达式,它们是unsigned long
和long long
, long long
不能保存unsigned long
所有值。 因此两个操作数都转换为unsigned long long
。
关于在比特级别的促销/转换期间发生的事情,让我们首先假设较低等级类型小于较高等级类型,并且有符号类型使用2的补码表示。
对于从32位int
到64位long
,如果该值为正,则在左侧添加包含所有0位的4个字节。 如果值为负,则在左侧添加包含全1位的4个字节。 例如,值5
的表示从0x00000005
更改为0x0000000000000005
。 对于值-5
,表示从0xfffffffb
变为0xfffffffffffffffb
。