小伙伴需要64位整数做物品的id,之前python sproto的判断有问题,写篇日志记录一下。

之前有问题的代码是这样的:

             if (!PyInt_Check(data)) {
PyErr_SetObject(SprotoError, PyString_FromFormat("type mismatch, tag:%s, expected int", tagname));
return -;
}
long i = PyInt_AsLong(data);
int vh = i >> ;
if (vh == || vh == -) {
*(uint32_t *)args->value = (uint32_t)i;
return ;
} else {

这里有两个问题。一,long只保证有32bit(via wiki),有可能data是64bit的,这个时候就会丢数据。二,vh的定义是int,这里会丢数据。vh是i通过位移得到的,目的是判断高位有没有数据,如果只有符号位有意义,就不用64bit存了,可以转到32bit里放数据。但是,我把vh强转成int,这样刚好就丢掉了符号位,然后让次高位充当了符号位,这时候得到的数据是错误的。

现在改成了这样:

            if (PyInt_Check(data) || PyLong_Check(data)) {
long long i = PyLong_AsLongLong(data);
long long vh = i >> ;
if (vh == || vh == -) {
*(int32_t *)args->value = (int32_t)i;
return ;
} else {
*(int64_t *)args->value = (int64_t)i;
return ;
}

看起来没问题了:)

python sproto支持64位有符号整数的更多相关文章

  1. 【电脑常识】如何查看电脑是32位(X86)还是64位(X64),如何知道硬件是否支持64位系统

    开始->运行->输入cmd确定->输入systeminfo 回车 待加载完成,就会看到如下信息(不同版本略有差异): 一.如何查看电脑是32位(X86)还是64位(X64) 方法2: ...

  2. 字符转码开源库libiconv目前还不支持64位

    最新版的libiconv 1.14目前还不支持64位系统,只能编译出32位库. libiconv 1.14下载地址: http://ftp.gnu.org/pub/gnu/libiconv/libic ...

  3. 判断电脑CPU硬件支不支持64位

    你可以在注册表中查看: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment\PROCESSO ...

  4. 发现Xilinx Virtex 5 FPGA中单个DSP乘法器只支持17位无符号乘法

    发现Xilinx Virtex 5 FPGA中,单个DSP乘法器只支持17位无符号乘法.如果令18位乘数相乘,结果会与正确的乘积不同.

  5. PL/SQL不支持64位Oracle Client 解决办法

    解决X64操作系统PL/SQL连接报错问题 make sure you have the 32 bits oracle client installed 说明PLSQL Developer并不支持Or ...

  6. 功能强大支持64位操作系统的转Flash软件(doc转swf):Print2Flash

    Print2Flash是一个虚拟打印机类的文档转换软件,因此只要是可打印的文档,都可以轻松转换为Flash文件,即SWF动画,特别是用于转换PDF.Word.Excel.PowerPoint等文档为S ...

  7. 怎么确定你的CPU是否支持64位虚拟化

    http://www.grc.com/securable.htm 第一个64位表示你的电脑最多支持多少位的系统,32或者64. 第二个表示你的硬件是否支持DEP?Yes,支持.No,不支持.OFF,表 ...

  8. Unity3d使用高通Vuforia发布IOS工程不支持64位的一些解决办法

    1.将Unit升级至4.6.x或5.0.x,将Vuforia差距升级到最新版本(vuforia-unity-mobile-android-ios-4-0-105 ) 2.平台Other Setting ...

  9. 【工具】清理Windows Installer冗余文件(支持64位NT6.x系统)

    样子: 支持系统: Windows NT 5.x/6.x 32及64位所有系统.需.net framework 2.0运行环境 功能: 清理上述系统中冗余的Windows Installer补丁文件. ...

随机推荐

  1. 大数的除法 不使用BigInteger Java实现

    import java.util.Arrays; public class Solution { public void div(String a, String b) { char[] chara ...

  2. dede日期时间标签调用大全

    dedecms最强大的功能就是调用标签,可以变换出各种样式的文章形式出来,本节将DEDECMS调用时间的样式做一个总结,基本所有的时间调用样式都有了,日期时间格式 (利用strftime()函数格式化 ...

  3. 使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  4. MicroERP软件更新记录2.0

    本次更新: 版本:2.0 内容:人力资源日常管理.工资薪酬.绩效考核 下次更新: 版本:2.1 内容:客户关系管理 开发载图: 截图(部分):

  5. Git版本库

    创建版本库:git init db 只要用git init db 就可以很容易创建一个空的Git版本库. Git版本库创建好之后,在版本库的目录下有一个.git的子目录中有几项内容,其中注意三项: 1 ...

  6. dwg格式用什么打开

    dwg文件怎么打开?dwg格式用什么打开?如何打开dwg文件?今天小编在这里推荐几款控件可以实现打开预览编辑DWG格式文件的目的. CADViewX是一款强大的CAD文件以及图片浏览库,在不需要其他三 ...

  7. window下安装jupyter

    1.Install [Anaconda](https://docs.continuum.io/anaconda/install#anaconda-install) 实际上安装了anaconda就已经安 ...

  8. 安全协议系列(五)---- IKE 与 IPSec(上)

    IKE/IPSec 属于网络层安全协议,保护 IP 及上层的协议安全.自上个世纪末面世以来,关于这两个协议的研究.应用,已经非常成熟.协议本身,也在不断地进化.仅以 IKE 为例,其对应的 RFC 编 ...

  9. Log4j简介

    Log4J日志配置详解   一.Log4j简介Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和 ...

  10. 自定义 placeholder 文本颜色

    原文  http://zhuyujia.github.io/2016/01/custom-placeholder-text-color.html Css: ::-webkit-input-placeh ...