C (无符号长)1和*(无符号长*)是什么意思?

C (无符号长)1和*(无符号长*)是什么意思?,c,casting,floating-point,type-conversion,bitwise-operators,C,Casting,Floating Point,Type Conversion,Bitwise Operators,这是一个打印浮点整数位表示的程序。*(无符号长*)a和(无符号长)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)

这是一个打印浮点整数位表示的程序。
*(无符号长*)a
(无符号长)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;
}
#包括
无效打印位(无效*a){
int i;
无符号长x;
x=*(无符号长*)a;
对于(i=63;i>=0;i--){
if((x&((无符号长)1都是显式类型转换


(unsigned long*)a
a
强制转换为指向
unsigned long
的指针,然后取消对它的引用,将其值赋给局部变量
x


只需将
1
强制转换为
unsigned long
,默认情况下,其类型为
int


第一个是必需的,因为您无法取消引用
void
指针,第二个是为了避免未定义的行为,请参阅。更多详细信息。

两者都是,即显式类型转换


(unsigned long*)a
a
强制转换为指向
unsigned long
的指针,然后取消对它的引用,将其值赋给局部变量
x


只需将
1
强制转换为
unsigned long
,默认情况下,其类型为
int



第一个是必需的,因为您不能取消引用
void
指针,第二个是为了避免未定义的行为,请参阅。更多详细信息。

它们是类型转换。您熟悉类型转换的一般工作方式吗?关于从(void*)到(unsigned long*)的类型转换的说明:不应该这样做;应该使用memcpy来避免严格的别名问题。请注意,如果在GCC中使用LTO进行编译,编译器没有义务将double写入内存以创建指向它的空指针。它可以内联函数调用。它可以使用严格的别名规则来假定double和unsigned long没有任何关系互相处理。换句话说,void*a的内存可能是空白的。@NateEldredge我见过一些例子,但新的人深入研究了它们。可能会读一些关于这个主题的文章。它们是类型转换。你熟悉类型转换的一般工作方式吗?关于从(void*)到(unsigned long*)的类型转换的注释:不应该这样做;应该使用memcpy来避免严格的别名问题。请注意,如果在GCC中使用LTO进行编译,编译器没有义务将double写入内存以创建指向它的空指针。它可以内联函数调用。它可以使用严格的别名规则来假定double和unsigned long没有任何关系不要互相干涉。换句话说,void*a的内存可能是空的。@NateEldredge我看到了一些例子,但更新的人深入研究了它们。可能会读一些关于这个主题的文章,例如:“第二个不是真的(需要)”-->
(unsigned long)1 Re:“第二个不是真的(需要)”-->
(unsigned long)1
x = *(unsigned long *)a; 
    ^                
//dereference
(unsigned long)1