什么时候在C ++中发生隐式类型转换?

问题描述 投票:1回答:1

假设我们有以下代码,意在将a的位移到i左侧,并用ia MSB替换ib LSB

unsigned short a;
unsigned short b;
auto i = 4;

a = (a << i) | (b >> (16 - i));

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

unsigned short a;
unsigned int b;
auto i = 4;

a = (a << i) | (b >> (32- i));

我担心“overshiftinga。但是,根据a促销到unsigned int的时间,价值可能是也可能不是超速。考虑一下i=24的值。如果在转换后发生类型转换,这将导致未定义的行为,但不是之前。因此,我的问题是在这种情况下何时会发生类型转换?我想我可以明确地将a强制转换为更大的类型,但如果可能的话,我想避免这种情况。

c++ casting implicit-conversion bit-shift
1个回答
1
投票

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

[...]操作数应为整数或无范围的枚举类型,并执行整体促销。结果的类型是提升的左操作数的类型。 [...]

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

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

© www.soinside.com 2019 - 2024. All rights reserved.