pho*_*xis 4 c bit-manipulation bit-shift bit
1.考虑以下事项:
unsigned int a, b;
b = a >> ((sizeof a) * CHAR_BIT);
/* or 2nd operand greater than ((sizeof a) * CHAR_BIT) */
Run Code Online (Sandbox Code Playgroud)
这是定义的,未定义的行为还是依赖于实现的行为?
2.另一个子问题:
在这种情况下a是signed int,它被移位小于其位长度,是限定的签名比特移位实现或未定义的行为.在这两种情况下:
a >> 5a << 5编辑编辑问题
1.
从C99标准,第6.5.7节:
对每个操作数执行整数提升.结果的类型是提升的左操作数的类型.如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义.
所以这是未定义的.
2.
从同一部分:
结果
E1 << E2是E1左移位E2位置; 腾出的位用零填充.如果E1具有无符号类型,则结果的值为E1x 2E2,比结果类型中可表示的最大值减少一个模数.如果E1有一个带符号的类型和非负值,并且E1x 2E2可以在结果类型中表示,那么这就是结果值; 否则,行为未定义.结果
E1 >> E2是E1右移位E2位置.如果E1有一个无符号类型或如果E1有一个签名的类型和一个非负的值,则结果的值是的商的整数部分E1/ 2E2.如果E1具有有符号类型和负值,则结果值是实现定义的.
因此,对于左移,如果a签名和正面,则定义明确.如果a签名和否定,则不确定.
对于右移,如果a签名是正面的,则定义明确.它是实现定义的,如果a签名和否定.
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |