是>> ((sizeof a)* CHAR_BIT)定义,UB还是IDB?

时间:2011-09-07 11:23:53

标签: c bit-manipulation bit bit-shift

1。 请考虑以下事项:

unsigned int a, b;

b = a >> ((sizeof a) * CHAR_BIT);

/* or 2nd operand greater than ((sizeof a) * CHAR_BIT) */

这是定义的,未定义的行为还是依赖于实现的行为?

2。 还有一个子问题:

如果asigned int且移位小于其位长,则是已签名的位移实现定义或未定义的行为。在这两种情况下:

  1. 向右移动时:a >> 5
  2. 向左移动时:a << 5
  3. 编辑编辑问题

1 个答案:

答案 0 :(得分:7)

<强> 1

从C99标准,第6.5.7节:

  

对每个操作数执行整数提升。结果的类型是   升级的左操作数。 如果右操作数的值为负数或为   大于或等于提升左操作数的宽度,行为未定义

所以它未定义。

<强> 2

来自同一部分:

  

E1 << E2的结果是E1左移E2位位置;腾出的位用零填充。如果E1具有无符号类型,则结果的值为E1 x 2 E2 ,比结果类型中可表示的最大值减少一个模数。 如果E1具有签名类型和非负值,并且E1 x 2 E2 在结果类型中可表示,那么这就是结果值;否则,行为未定义。

     

E1 >> E2的结果是E1右移E2位位置。如果E1具有无符号类型,或者如果E1具有有符号类型和非负值,则结果的值是E1 / 2 <的商的不可分割部分SUP> E2 即可。 如果E1具有签名类型和负值,则结果值为实现定义

因此,对于左移,如果a已签名且为正,则定义明确。如果a已签名且为否定,则未定义。

对于右移,如果a已签名且为正,则定义明确。如果a已签名且为否定,则为实施定义。