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