问题描述

有如下代码

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,令编译器识别它是一个长整数,位移操作才是正确的。


luqiuwen
34 声望0 粉丝