(unsigned long)1 和 *(unsigned long *) 是什么意思?

What does (unsigned long)1 and *(unsigned long *) mean?

这是一个打印浮点整数位表示的程序。 *(unsigned long *)a(unsigned long)1 是什么意思?

#include <stdio.h>

void printBits(void *a){

    int i;
    unsigned long x;
    x = *(unsigned long *)a;
    for (i = 63; i >= 0; i--){
        if ((x & ((unsigned long)1 << i)) != 0)
            printf("1");
        else
            printf("0");
        if (i == 63)
            printf(" ");
        if (i == 62)
            printf(" ");
        if (i == 52)
            printf(" ");
    }
    printf("\n");
}

int main(void){
    
    double x = -145.4;
    printBits(&x);
    return 0;
}

两者都是type casts显式类型转换。


x = *(unsigned long *)a; 
    ^                
//dereference

(unsigned long *)aa 转换为指向 unsigned long 的指针,然后取消引用它以将其值分配给局部变量 x.


(unsigned long)1

简单地将 1 转换为 unsigned long,默认情况下类型为 int.


第一个是必需的,因为您不能取消引用 void 指针,第二个是为了避免未定义的行为,请参阅 . More details here