繁体   English   中英

将void指针强制转换为long类型,而不是long指针?

[英]Casting void pointer to long type, not pointer long?

 int cmpLong(void *a, void *b) {
    long aa = (long)a;
    long bb = (long)b;
    return aa - bb;
}

我真的不明白这段代码的目的是什么? 当void指针强制转换为长整数时,它是一个任意数字还是仍然具有某些含义?

我重新编写了这段代码,以便比较void *a and void *b

这是我重新编写的代码:

int cmpLong(void *a, void *b) {
    // casting void pointers to long pointers
    long *aa = (long*)a;
    long *bb = (long*)b;
    return *aa - *bb;
}

这对我来说更有意义,但我不知道它是否在执行与原始代码相同的操作。

这些完全可以做不同的事情。

 int cmpLong(void *a, void *b) {
    long aa = (long)a;
    long bb = (long)b;
    return aa - bb;
}

这是比较两个地址。 它将返回两个地址值之间的字节数差。 为了理解这一点,让我们给他们一些数字,然后玩电脑。

a = 0x2000;
b = 0x1000;
long aa = (long)a; // So aa = 0x1000.  Casting only changes the type, not the value.
long bb = (long)b; // bb = 0x2000.
return aa - bb;    // 0x2000 - 0x1000 => returns 0x1000

现在,让我们看一下您的示例,它所做的是完全不同的事情。

int cmpLong(void *a, void *b) {
    // casting void pointers to long pointers
    long *aa = (long*)a;
    long *bb = (long*)b;
    return *aa - *bb;
}

玩同一游戏:

a = 0x2000;
b = 0x1000;
long* aa = (long*)a;  // aa = 0x1000.  Casting still doesn't change the value.
long* bb = (long*)b;  // bb = 0x2000.
return *aa - *bb;     // *aa is the data at 0x1000.  This data is treated as a long value.
                      // *bb is the data at 0x2000, again treated as a long value.
                      // so *aa - *bb is the difference between the values at 0x2000 and 0x1000 when read as longs.

顺便说一句,我刚刚学习了一种很难的方法,即您不能将指针强制转换为long类型,并且期望能够将其强制转换为指针。 负指针值将无法保存转换:最高位将被复制。

也许unsigned long可以工作,但是由于我是通过swig将该值传递给java的,而Java没有unsigned整数类型,所以我无法尝试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM