博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对立即数进行位移引发的小问题
阅读量:6259 次
发布时间:2019-06-22

本文共 583 字,大约阅读时间需要 1 分钟。

问题描述

有如下代码

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://sthsa.baihongyu.com/

你可能感兴趣的文章
第1章 JVM语言家族概览 《Kotin 编程思想·实战》
查看>>
spring之HttpInvoker
查看>>
我为什么“放弃”从事八年的嵌入式领域
查看>>
TypeScript基础入门 - 函数 - 重载
查看>>
【ASP】当前星期几和月份名称输出
查看>>
好看的皮囊 · 也是大自然的杰作 · 全球高质量 · 美图 · 集中营 · 美女 · 2017-08-23期...
查看>>
小二,给我来一个递增序列
查看>>
images
查看>>
又一款开源手机要来了 —— WiPhone
查看>>
爬虫入门之反反爬虫机制cookie UA与中间件(十三)
查看>>
【飞天存储服务月报】2018年6月刊
查看>>
AJAX的一些硬知识
查看>>
第208天:jQuery框架封装(一)
查看>>
JNDIUtil、DBCPUtil、C3P0Util,三种数据源的工具类的区别?
查看>>
暴风魔镜裁员了,但是VR的春天依然在路上
查看>>
Java并发编程笔记之CyclicBarrier源码分析
查看>>
Weex在苏宁移动办公开发中是如何实践的?
查看>>
阿里倡导成立“罗汉堂”, 6名诺贝尔奖得主加入
查看>>
WebLogic 12c控制台上传获取webshell
查看>>
web3j 的 Infura Http 客户端
查看>>