问题描述
有如下代码
typedef uint64_t socket_mask_t;
for (unsigned int socket = 0; socket < sizeof(socket_mask_t) * 8; socket++)
{
if ((socket_mask & (1 << socket)) == 0)
continue;
}
这段代码想利用循环,逐位判断掩码socket_mask是否为1,若这一位为1,则进行下面的操作,否则跳过。
socket_mask是一个64位的数。我们假设socket_mask=1,理论上当且仅当socket=1时,进入循环体执行continue以后的代码。但实际上,socket=1和socket=32时,循环体内的代码都会被执行。
解决方案
将原有的
if ((socket_mask & (1 << socket)) == 0)
continue;
更改为
if ((socket_mask & (1L << socket)) == 0)
continue;
就解决了这个问题。
原因分析
立即数1不加L时,编译器认为它是一个32位的整数。当位移操作超出了被位移变量的宽度时,其结果不能确定。因此,需要将立即数1写成1L,令编译器识别它是一个长整数,位移操作才是正确的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。