双精度地址转换

时间:2017-07-29 10:55:45

标签: c double precision

我在互联网上看到了一个代码并且可以打印出有意义的字符串,但是没有理解它是如何工作的,任何人都可以解释这些逻辑吗?谢谢!

#include <stdio.h>
double x = 6.55538260547163850123456789E-260, y;
int main(){return(*(char*)&x?x*=y=x,main():printf((char*)&y));}

更新

我已将代码清理成

#include <stdio.h>
double x = 6.55538260547163850123456789E-260, y;
int main(){
  if (*(char*)&x) {
    y = x;
    x *= y;
    main();
  } else {
    printf((char*)&y);
  }
}

但仍然不知道(char*)&y如何成为一个有意义的字符串,我认为这是关于双精度或地址演员,所以这就是标题

更新II:

我认为核心代码是:

#include <stdio.h>
double x = 6.55538260547163850123456789E-260, y;
int main(){
  y = x;
  printf((char*)&y);
}

但地址演员仍然很奇怪。

1 个答案:

答案 0 :(得分:1)

它将double值的字节重新解释为字符串。这将查看字节:

#include <stdio.h>
double x = 6.55538260547163850123456789E-260;
int main(){
    unsigned char *y = (unsigned char *)&x;
    for (int i = 0; i < sizeof(double); i ++) {
        printf("%02hhx %c\n", y[i], y[i]);
    }
}

在我的电脑上吐出

61 a
73 s
6f o
75 u
6c l
20  
20  
0a 

但是这里存在一个问题 - 字符串是"asoul \n" - 但是没有终止\0 - 所以实际上你的代码未定义的行为,即使在我的笔记本电脑上我有意义消息。