zoukankan      html  css  js  c++  java
  • python sproto支持64位有符号整数

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

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

                 if (!PyInt_Check(data)) {
                     PyErr_SetObject(SprotoError, PyString_FromFormat("type mismatch, tag:%s, expected int", tagname));
                     return -1;
                 }
                 long i = PyInt_AsLong(data);
                 int vh = i >> 31;
                 if (vh == 0 || vh == -1) {
                     *(uint32_t *)args->value = (uint32_t)i;
                     return 4;
                 } 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 >> 31; 
                     if (vh == 0 || vh == -1) {
                         *(int32_t *)args->value = (int32_t)i;
                         return 4;
                     } else {
                         *(int64_t *)args->value = (int64_t)i;
                         return 8; 
                     }

    看起来没问题了:) 

  • 相关阅读:
    不同的ospf进程发布互联网段可以互通
    大数分解
    主席树(非权值)
    块状数组
    Codeforces Round #744 (Div. 3) G. Minimal Coverage
    记录一种从天而降的掌法(动态维护中位数的方法)
    快速统计二进制中1的数量
    网络流(小常数)
    矩阵快速幂
    米勒罗宾素性检验
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/python_sproto_support_64bit_integer.html
Copyright © 2011-2022 走看看