kzh971104 发表于 2017-12-21 12:53:15

c编译器干了什么 处理器干了什么 结果与逻辑不符合

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<string.h>
#include<stdio.h>


typedef struct AdvTeacher
{

        char name;//64
        int age;//4字节
        int p;//4字节
        char * pname2;


}AdvTeacher;
int main()
{
        AdvTeacher t1;
        AdvTeacher * p = NULL;
        int offset = 0;
        int offset1 = 0;
        int offset2 = 0;
        int offset3 = 0;
       
        p = &t1;

       

        offset=(int)((&(p->age)) - p);
        offset3 = (int)&(p->age) - (int)p;


        printf("%d\n", (int)&(p->age));
        printf("%d\n", (int)p);

        printf("%d\n", offset3);

        printf("%d\n", offset);

        printf("hello world \n");
        system("pause");
        return 0;
}




上面代码 求age相对地址
为什么 用           offset3 = (int)&(p->age) - (int)p;      可以得到 偏移
但是 用                     offset=(int)((&(p->age)) - p);          却不能

BngThea 发表于 2017-12-21 12:59:10

自己用反汇编看一下执行过程就知道了

kzh971104 发表于 2017-12-21 13:03:55

BngThea 发表于 2017-12-21 12:59
自己用反汇编看一下执行过程就知道了

看过了 将结果右移了 我想知道的是 为什么右移动 内部移动根据原因

kzh971104 发表于 2017-12-21 13:08:12

BngThea 发表于 2017-12-21 12:59
自己用反汇编看一下执行过程就知道了

我要的是它内部执行 sar原因

人造人 发表于 2017-12-21 13:36:04

offset3 = (int)&(p->age) - (int)p;
相当于
offset3 = (    (int)&(p->age)    ) - (    (int)p    );
这个不用解释吧


offset = (int)((&(p->age)) - p);
相当于
offset = (int)(   &(p->age) - p   );
这个也不用解释吧


那么
offset = (int)(   &(p->age) - p   );
就是两个指针相减
一个 int * 减 一个 AdvTeacher *
至于为什么使用sar指令,我还没有找到原因,我再花点时间试试
^_^

kzh971104 发表于 2017-12-21 13:47:19

人造人 发表于 2017-12-21 13:36
相当于

这个不用解释吧


。。。。。。 你是在教我看 代码吗 大兄弟

人造人 发表于 2017-12-21 13:53:20

两个不同类型的指针相减,肯定会统一类型,那么是统一成 int *-int *,还是 AdvTeacher *-AdvTeacher *   ?
试一试不就知道了^_^

offset = (int)(   (AdvTeacher *)&(p->age) - p   );

offset = (int)(   &(p->age) - (int *)p   );

经过测试是
offset = (int)(   &(p->age) - (int *)p   );
也就是 int *-int *

推到这里,我已经明白了为什么使用sar指令了,你明白了吗?
最后,给出一段代码

#include<stdio.h>

int main(void)
{
        int arr = {1, 2, 3};
        int *p1 = &arr;
        int *p2 = &arr;

        int offset4 = p2 - p1;
       
        return 0;
}
        int offset4 = p2 - p1;
0139171B 8B 45 D4             mov         eax,dword ptr
0139171E 2B 45 E0             sub         eax,dword ptr
01391721 C1 F8 02             sar         eax,2
01391724 89 45 C8             mov         dword ptr ,eax

人造人 发表于 2017-12-21 13:57:21

kzh971104 发表于 2017-12-21 13:47
。。。。。。 你是在教我看 代码吗 大兄弟

给我点时间好吗?
^_^

kzh971104 发表于 2017-12-21 15:47:31

人造人 发表于 2017-12-21 13:53
两个不同类型的指针相减,肯定会统一类型,那么是统一成 int *-int *,还是 AdvTeacher *-AdvTeach ...

哇 谢谢明白了

人造人 发表于 2017-12-21 15:56:51

kzh971104 发表于 2017-12-21 15:47
哇 谢谢明白了

^_^
页: [1]
查看完整版本: c编译器干了什么 处理器干了什么 结果与逻辑不符合