鱼C论坛

 找回密码
 立即注册
查看: 2412|回复: 2

[技术交流] 64位值以及64位原子访问

[复制链接]
发表于 2016-7-22 16:58:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
可能一些鱼油会觉得,64位和32位是一样的,其实不是的。如果你直接赋一个64位的值给InterlockedExchangeAdd,你的VS可能会报错:
“初始化”: 从“__int64”到“int”截断

于是,64位版int(__int64)便诞生了
还是举个栗子
  1. #include<Windows.h>
  2. volatile long l = 0;
  3. int main(){
  4.         InterlockedExchangeAdd(&l, 283498282349);
  5.         return 0;
  6. }
复制代码

这样,VS编译就多了几个警告:
  1. 1>------ 已启动生成:  项目: 原子访问, 配置: Release Win32 ------
  2. 1>  源.cpp
  3. 1>源.cpp(4): warning C4305: “参数”: 从“__int64”到“LONG”截断
  4. 1>源.cpp(4): warning C4309: “参数”: 截断常量值
  5. ========== 生成:  成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
复制代码

然后,l就会不断溢出然后变成最小值又溢出又变成最小值,所以l的值不可能是2930923919239!
改进版:
  1. #include<Windows.h>
  2. volatile __int64 i = 0;//__int64是64位版的int
  3. int main(){
  4.         InterlockedAdd64(&i, 283498282349);
  5.         return 0;
  6. }
复制代码

现在就没有警告了。
64位原子访问基本与32位原子访问相同,只不过是要用__int64而已。
64位原子访问函数:
  InterlockedAdd64 递增一个64位值

88888~

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-29 23:12:55 | 显示全部楼层
楼主我的VS2015做网站的时候运行总是报ISS EXPRESS.exe不能附加到程序怎么办,请教大牛!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-29 23:13:58 | 显示全部楼层
顶一顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 04:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表