c中的双重铸造
我已经看过了,我注意到这个演员看起来很奇怪c中的双重铸造,c,casting,C,Casting,我已经看过了,我注意到这个演员看起来很奇怪 oldidt = (unsigned long long *)(*(unsigned long*)(oldidtr+1)); 在我看来,第一次强制转换似乎影响了+1,因此它将移动4个字节(一个指针),第二次强制转换的结果是无符号长*。而内部铸件外壳上的恒星是一颗“访问此记忆”恒星 是这样吗 如果最初的定义是一个指针,而我们要转换到另一个指针,那么+1仍然是一个4字节的跳转 如果我改为编写oldidt=*(oldidt+1),会发生什么?(假设编
oldidt = (unsigned long long *)(*(unsigned long*)(oldidtr+1));
在我看来,第一次强制转换似乎影响了+1
,因此它将移动4个字节(一个指针),第二次强制转换的结果是无符号长*
。而内部铸件外壳上的恒星是一颗“访问此记忆”恒星
- 是这样吗
- 如果最初的定义是一个指针,而我们要转换到另一个指针,那么
仍然是一个4字节的跳转+1
- 如果我改为编写
oldidt=*(oldidt+1),会发生什么代码>?(假设编译器没有抱怨,并给出和exec)
oldidt
的声明是:
static unsigned long long *oldidt;
我根据调用(左边是第二个)将强制转换调用为“first”和“second”。这段代码似乎使用了几个
无符号短int
将指针存储为两半。这假定无符号短int
的宽度为指针的一半。代码从两个相邻的短字符(即数组的第二个和第三个成员)中提取存储的指针,并将其解释为指向无符号长整型的指针
因此,将整数重新解释为指针需要最后一次强制转换,而第一次(内部)强制转换用于从现有变量中读取不同类型的值,即长值和短值(或者更确切地说,从两个相邻的短值)。将根据指针的任何类型执行+1增量oldidtr
(显然是unsigned short
)(周围的括号阻止与强制转换进行任何可能的交互。)然后将结果强制转换为unsigned long*
,并使用*
访问该位置的值。该值已获取(可能是两个short的组合)然后将其转换为一个unsigned long
并存储在oldidt中。Oops,结果被转换为指向unsigned long
的指针(不,这没有任何意义。但这毕竟是内核代码。通常会做一些无意义的事情。)oldidtr是一个短指针:静态unsigned short oldidtr[3]
为什么一个人可能需要这样做?在汇编中,根据目标机器的不同,在给定大小的“字”中“压缩”尽可能多的数据是很常见的;在C中对指针这样做有什么意义?@user2485710-C和assembler之间没有区别,因为它们需要“压缩”--这样做是为了使系统控制块与某些分配方案、以前的设计等保持一致。@user2485710-哪里有什么?@HotLicks nevermind,这是在编辑之前对您的评论的答复。但是,这又有什么用呢?