C语言中的联合读/写

C语言中的联合读/写,c,C,我很难理解为什么下面代码的输出不是我所期望的。在第一次循环迭代中,所有值都正确打印,但是在所有后续迭代中,fi_union.float_val的输出为0 我使用union从本质上替换指针别名,并能够将64位解释为uint64\u t或IEEE 754双精度值。这样做对吗 我知道一个IEEE 754值的位移位本质上会导致垃圾。听起来很奇怪,这就是我想要的。我真的很想知道为什么fi_union.float_val在第一次迭代后为零。我没有打开任何GCC优化 我在x86_64体系结构上使用gcc版本4

我很难理解为什么下面代码的输出不是我所期望的。在第一次循环迭代中,所有值都正确打印,但是在所有后续迭代中,fi_union.float_val的输出为0

我使用union从本质上替换指针别名,并能够将64位解释为uint64\u t或IEEE 754双精度值。这样做对吗

我知道一个IEEE 754值的位移位本质上会导致垃圾。听起来很奇怪,这就是我想要的。我真的很想知道为什么fi_union.float_val在第一次迭代后为零。我没有打开任何GCC优化

我在x86_64体系结构上使用gcc版本4.4.3

double v1 = 0xDE.62133p0;

union float_interpret
{
    uint64_t val;
    double float_val;

} fi_union;


for( int i = 0; i <= 35; i++ )
{
    fi_union.val = *(uint64_t*)(&v1) >> i;
    printf( "\n %f >> %*i = %16lX \t %20li \t %15f", v1, 2, i, fi_union.val, fi_union.val, fi_union.float_val );
}
double v1=0xDE.62133p0;
联合浮点数
{
uint64_t val;
双浮阀;
}菲尤联盟;
对于(int i=0;i>i;
printf(“\n%f>>%*i=%16lX\t%20li\t%15f”,v1,2,i,fi_union.val,fi_union.val,fi_union.float_val);
}

您说,第一次通过循环时,它会按照您的预期工作,但不会在以后的迭代中工作。我面前没有gcc编译器,所以我无法测试它,但这对您有用吗

fi_union.float_val = v1;
for( int i = 0; i <= 35; i++ )
{
    printf( "\n %f >> %*i = %16lX \t %20li \t %15f", v1, 2, i, fi_union.val, fi_union.val, fi_union.float_val );
    fi_union.val = fi_union.val >> 1;
}
fi_union.float_val=v1;
对于(int i=0;i>1;
}

查看运算符优先级规则,您对
fi_union.val
的赋值应该有效,但我猜这就是
I>0
时不起作用的地方。因此,尝试通过使用union替换指针别名来绕过它。

您说第一次通过循环时,它会按照您的预期工作,但不会在以后的迭代中工作s、 我面前没有gcc编译器,所以我无法测试它,但这对您有用吗

fi_union.float_val = v1;
for( int i = 0; i <= 35; i++ )
{
    printf( "\n %f >> %*i = %16lX \t %20li \t %15f", v1, 2, i, fi_union.val, fi_union.val, fi_union.float_val );
    fi_union.val = fi_union.val >> 1;
}
fi_union.float_val=v1;
对于(int i=0;i>1;
}

查看运算符优先级规则,您对
fi_union.val
的赋值应该有效,但我猜当
I>0
时,这是不起作用的。因此,请尝试通过使用union替换指针别名来绕过它。

根据IEEE 754,浮点变量是由三个或多个变量组成的复合数据结构四个组件:符号、指数、尾数和可选的NaN标志(嵌入尾数中)。像在
fi\u union.val=*(uint64\u t*)(&v1)>>i;中那样移动整个内存表示将不会返回任何有意义的内容

因此,预期结果确实是您所看到的,在第一次迭代中,当i=0时,不执行移位,返回的值正常。当您开始移位浮点的内存表示中的位时,您将符号位移到指数上,指数位移到尾数上,等等。这会导致混乱

如果要检查浮点数的内存表示形式的内容,请使用glibc提供的

类似于此(未经测试):

#包括
...
联合ieee754_双x;
x、 d=v1
printf(“符号:%u;尾数:%llu;指数:%u\n”,
(无符号)x.ieee.negative,

((unsigned long long)x.ieee.尾数a1根据ieee 754,浮点变量是由三个或四个组件组成的复合数据结构:符号、指数、尾数和可选的NaN标志(嵌入尾数中)。像在
fi_union.val=*(uint64_t*)(&v1)中那样移动整个内存表示形式>>i;
将不会返回任何有意义的内容

因此,预期结果确实是您所看到的,在第一次迭代中,当i=0时,不执行移位,返回的值正常。当您开始移位浮点的内存表示中的位时,您将符号位移到指数上,指数位移到尾数上,等等。这会导致混乱

如果要检查浮点数的内存表示形式的内容,请使用glibc提供的

类似于此(未经测试):

#包括
...
联合ieee754_双x;
x、 d=v1
printf(“符号:%u;尾数:%llu;指数:%u\n”,
(无符号)x.ieee.negative,

((无符号长)我知道位移位会破坏原来的ieee 754编码,我希望新的移位编码被解释为双精度编码并相应地输出。我知道位移位会破坏原来的ieee 754编码,我希望新的移位编码被解释为双精度编码并相应地输出。我没有得到任何运气我仍然需要通过
I
对原始值进行位移:
fi\u union.val=(uint64\u t)(&v1)>>I;
我没有任何运气让它工作。我仍然需要通过
I
对原始值进行位移:
fi\u union.val=(uint64\u t)(&v1)>>I;