隐式类型转换何时在C++发生?
When does implicit type conversion occur in C++?
假设我们有以下代码,旨在将a
位向左移动i
,并将a
的i
LSB替换为b
的i
MSB
unsigned short a;
unsigned short b;
auto i = 4;
a = (a << i) | (b >> (16 - i));
这按预期工作。现在,让我们考虑一下我们希望能够为不同类型的对执行此操作的情况,即我们希望将a
位向左移动i
,并将a
的i
LSB 替换为b
的i
MSB,只是现在我们不保证a
和b
的大小, 只是他们没有签名。让我们考虑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)
)。
相关文章:
- 为什么会发生堆损坏
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++中的赋值发生,尽管右侧出现异常
- 写入位置0x0000000C时发生访问冲突
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 在cygwin中运行c++脚本时发生错误
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 编译器对数组声明大小的计算。什么时候发生?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 当 I2C 值在C++中发生变化时收到通知
- 为什么:不同符号的整数比较只是偶尔发生?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化