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个字节(一个指针),第二次强制转换的结果是
无符号长*
。而内部铸件外壳上的恒星是一颗“访问此记忆”恒星

  • 是这样吗
  • 如果最初的定义是一个指针,而我们要转换到另一个指针,那么
    +1
    仍然是一个4字节的跳转
  • 如果我改为编写
    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,这是在编辑之前对您的评论的答复。但是,这又有什么用呢?