gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:48:28 27 4
gpt4 key购买 nike

假设我们有以下代码,旨在将 a 的位向左移动 i 并替换 i 的 LSB ab

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

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

这按预期工作。现在,让我们考虑一下我们希望能够对不同类型的对执行此操作的情况。即我们希望将 a 的位向左移动 i 并将 ai LSB 替换为 bi MSB,除了现在我们无法保证 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 显式转换为更大的类型,但我想尽可能避免这种情况。

最佳答案

这里是标准的相关引用,[expr.shift/1] :

[...] The operands shall be of integral or unscoped enumeration type and integral promotions are performed. The type of the result is that of the promoted left operand. [...]

这意味着在你的情况下 a 将被提升为 int(或 unsigned int)之前做转变。

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

关于c++ - C++中什么时候发生隐式类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55780737/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com