不同大小变量的按位运算符标准

时间:2016-05-11 19:59:39

标签: c++ bitwise-operators

$largeArray = [...];
$outputArray = array_filter($largeArray, function($element) {
    if (empty($element)) { return false; }
    return true;
});
echo implode(',', $outputArray);
  • 此示例的定义行为是什么?
  • int8 a = <some value>; int16 b = <some value>; a |= b; 线程化为16位整数吗?
  • a会丢掉8个最重要的位吗?
  • 他们都会使用寄存器大小并丢弃它无法分配的所有最高有效位吗?
  • 是不确定的行为?

2 个答案:

答案 0 :(得分:3)

这里将进行整体推广。 uint8_t将被提升为已签名 int以及uint16_t值,然后转换回uint8_t

答案 1 :(得分:2)

与大多数常见系统(我曾经使用的所有系统)一样,int8_tint16_t的转化率都低于int,两个操作数均为将被提升为后者。

然后,operator |=对这两个(通常为32位)int进行操作,在最后一步中,生成的int将转换为int8_t。如果结果不适合int8_t,则a的值是实现定义的。通常,它只会丢弃额外的位。

实际上,对于所有系统,int至少为16位且long至少为32位,因此您使用的类型都不能包含排名大于int