#include <stdio.h>
void main(){
printf("<IEEE754 double 内容表示器>\n0を入力したら終了。 10回やっても終了\n\n");
int i=10; while(i-->0){
double d; scanf("%lf",&d); if(d==0.0){goto L1;}
unsigned long long s;
signed long long q;
unsigned long long n;
// 符号と、2^q乗のq と、 2^q * n の nに分解
s= ( *( (unsigned long long*)&d )>>63 ) & 0x0000000000000001;
q= ( *( (unsigned long long*)&d )>>52 ) & 0x00000000000007FF;
n= ( *( (unsigned long long*)&d ) ) & 0x000FFFFFFFFFFFFF;
q -= 1023; // 1024 を 1の意味 として記録されてるので。1023 を引けば1になる。
n |= 0x0010000000000000; // 1.2345 のうち 0.2345 だけ記録されてるので。 1.2345 の形にもどす。
printf("signe=%llu q=%lld n=0x%llx\n",s,q,n);
// 復元
q += 1023; // 1024 を1の意味にする。
n &= 0x000FFFFFFFFFFFFF; // 1.2345 を 0.2345 の形にする。
unsigned long long fukugen= (s<<63) | (((unsigned long long)q)<<52) | n;
printf("fukugen sita double=%14.14f\n", *((double*)&fukugen) );
}
L1:return;
}