我们怎样才能在C99中获得带符号的浮点零点?实际上,我想查看它的位模式。
答案 0 :(得分:4)
通过签名的浮点零,我认为你的意思是负零。如果是,您可以使用-0.0
。
示例:
#include <stdio.h>
#include <string.h>
void test(double val)
{
unsigned char array[sizeof(double)];
memcpy(array, &val, sizeof(double));
for (int i = 0; i < sizeof(double); ++i )
{
printf("%02hhx", array[i]);
}
printf("\n");
}
int main()
{
double v1 = -0.0;
double v2 = 0.0;
test(v1);
test(v2);
};
我的设置输出(64位Linux / gcc 4.8.4):
0000000000000080
0000000000000000
C标准并未强制要求支持负零。我只能找到像“ On代表零签零的实现”这样的短语。
如果编译器对浮点数使用IEEE 754表示,则需要它们支持负零。来自https://en.wikipedia.org/wiki/Signed_zero#Representations。
在IEEE 754二进制浮点数中,零值由偏置指数和有效数表示,均为零。负零的符号位设置为1。作为某些计算的结果,可能会获得负零,例如,作为负数的算术下溢的结果,或
−1.0*0.0
,或简称为−0.0
答案 1 :(得分:1)
你可以使用C语句:
float zero = 0.0f;
所有float
都已签名,这是float
号码格式的一部分
答案 2 :(得分:1)
int main(){
float f = 0.0f;
//observe as an array of bytes
unsigned char *c = (unsigned char *)(&f);
//for each byte in the float
for (int i = 0; i < sizeof(float); ++i){
//for each bit in the byte
for (int j = 0; j < sizeof(char) * CHAR_BIT; ++j){
//print 1 or 0 based on the bit value
((c[i] >> j) & 1) ? printf("1") : printf("0");
}
}
}
看看Float Toy 它是可视化IEEE浮点格式的有用工具。