不同大小变量的按位运算符标准
Bitwise-operator standard for different sized variables
int8 a = <some value>;
int16 b = <some value>;
a |= b;
- 此示例的定义行为是什么?
a
会被线程化为 16 位整数吗?
b
会丢弃 8 个最高有效位吗?
- 它们都会使用寄存器大小并丢弃所有它无法分配的最高有效位吗?
- 这是未定义的行为吗?
与大多数常见系统一样†(我用过的所有系统),int8_t
和 int16_t
的转换等级都低于 int
, 两个操作数都会提升为后者。
然后,operator |=
对这两个(通常是 32 位)int
进行操作,在最后一步中,结果 int
被转换为 int8_t
。如果结果不适合 int8_t
,a
的值是实现定义的。通常,它只是丢弃额外的位。
† 实际上,这适用于所有系统,因为 int
至少是 16 位,而 long
至少是 32 位,所以这两种类型都不是您使用的排名可以大于 int
.
这里将进行积分提升。 uint8_t
将被提升为 signed int
,以及 uint16_t
值,然后转换回 uint8_t
.
int8 a = <some value>;
int16 b = <some value>;
a |= b;
- 此示例的定义行为是什么?
a
会被线程化为 16 位整数吗?b
会丢弃 8 个最高有效位吗?- 它们都会使用寄存器大小并丢弃所有它无法分配的最高有效位吗?
- 这是未定义的行为吗?
与大多数常见系统一样†(我用过的所有系统),int8_t
和 int16_t
的转换等级都低于 int
, 两个操作数都会提升为后者。
然后,operator |=
对这两个(通常是 32 位)int
进行操作,在最后一步中,结果 int
被转换为 int8_t
。如果结果不适合 int8_t
,a
的值是实现定义的。通常,它只是丢弃额外的位。
† 实际上,这适用于所有系统,因为 int
至少是 16 位,而 long
至少是 32 位,所以这两种类型都不是您使用的排名可以大于 int
.
这里将进行积分提升。 uint8_t
将被提升为 signed int
,以及 uint16_t
值,然后转换回 uint8_t
.