c - c中的双重类型转换

标签 c casting

我已经过了this code我注意到这个看起来很奇怪的类型转换

oldidt = (unsigned long long *)(*(unsigned long*)(oldidtr+1));  

在我看来,第一次转换似乎影响了 +1,因此它将移动 4 个字节(一个指针),第二次转换的结果是 unsigned long long *。而内铸外壳上的星星是一颗“访问这段内存”的星星。

  • 对吗?
  • 如果原来的定义是一个指针,为什么还要麻烦,而我们正在转换为另一个指针,+1 仍然是一个 4 字节的跳转。
  • 如果我改写 oldidt = *(oldidt+1); 会发生什么? (假设编译器没有报错,给出并执行)

oldidt 的声明是:

static unsigned long long *oldidt;  

我根据调用将转换称为“第一”和“第二”(左边是第二个)。

最佳答案

看起来这段代码使用了几个 unsigned short int 来将指针分成两半。这假设 unsigned short int 的宽度是指针的一半。该代码从两个相邻的 short 中提取存储的指针,即数组的第二个和第三个成员,并将其解释为指向 unsigned long long int 的指针。

因此,最后一次转换对于将整数重新解释为指针是必要的,而第一个(内部)转换用于从现有变量读取不同类型的值,即从短(或者更确切地说,从两个相邻的)短裤)。

关于c - c中的双重类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20460872/

相关文章:

php - 如何修复 PHP 中的警告非法字符串偏移

c - 我是否转换 malloc 的结果?

c - 坚持构建递归函数

c - 拼写检查程序问题

c# - 仅添加新方法而不添加数据时使用什么 OOP 模式?

php - 将数组中的所有数字值转换为整数类型,否则将非数字值保留为字符串

java - 为什么要先转换为 Closeable?

c++ - 鼠标过滤器驱动程序的问题

c - 在 C 中存储一个长小数

c - 用于存储字符串文字常量池的内存和ROM的word是一样的吗