隐式类型转换何时在C++发生?

When does implicit type conversion occur in C++?

本文关键字:C++ 发生 何时 类型转换      更新时间:2023-10-16

假设我们有以下代码,旨在将a位向左移动i,并将aiLSB替换为biMSB

unsigned short a;
unsigned short b;
auto i = 4;
a = (a << i) | (b >> (16 - i));

这按预期工作。现在,让我们考虑一下我们希望能够为不同类型的对执行此操作的情况,即我们希望将a位向左移动i,并将aiLSB 替换为biMSB,只是现在我们不保证ab的大小, 只是他们没有签名。让我们考虑a的大小小于b

的大小的情况
unsigned short a;
unsigned int b;
auto i = 4;
a = (a << i) | (b >> (32- i));

我担心"超移"a.但是,根据a提升到unsigned int的时间,值可能是也可能不是超移。考虑值i=24。如果类型转换发生在移位之后,但不是在移位之前,这将导致未定义的行为。因此,我的问题是在这种情况下何时会发生类型转换?我想我可以显式地将a转换为更大的类型,但如果可能的话,我想避免这种情况。

以下是标准中的相关引用,[expr.shift/1]:

[...]操作数应为整型或无作用域枚举类型,并执行整型升级。结果的类型是提升的左操作数的类型。[...]

这意味着在您的情况下,a将在轮班之前被提升为int(或unsigned int)。

请注意,对于当前的 32/64 位编译器,提升的类型是int,而不是unsigned int。仅当int不能表示整个unsigned short范围时,才unsigned int提升的类型(例如,对于旧的 16 位编译器,其中sizeof(int)为 2,sizeof(short)==sizeof(int))。