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