Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用0b表示法打印(printf)浮点_C_Binary_Floating Point_Printf - Fatal编程技术网

C 使用0b表示法打印(printf)浮点

C 使用0b表示法打印(printf)浮点,c,binary,floating-point,printf,C,Binary,Floating Point,Printf,我试着用二进制表示一个小数,然后把它打印成一个浮点数。我已经完成了定点到浮点的转换 十进制数字:-342.265625 固定点:-101010110.010001 32位浮点:11000011101010110010001000000000 64位浮点(双):110000000111010110000000000000000 *我用IEEE 754转换器仔细检查过 *我也知道printf更改浮动为double来打印它们,但是将其声明为double应该可以工作吗?我想 代码: 输出: Float:

我试着用二进制表示一个小数,然后把它打印成一个浮点数。我已经完成了定点到浮点的转换

十进制数字:-342.265625

固定点:-101010110.010001

32位浮点:11000011101010110010001000000000

64位浮点(双):110000000111010110000000000000000

*我用IEEE 754转换器仔细检查过

*我也知道printf更改浮动为double来打印它们,但是将其声明为double应该可以工作吗?我想

代码:

输出:

Float: 3282772480.000000
Double: 13868100853597995008.000000

编译器是gcc,标准是c99。问题是编译器试图帮助您。您的文本(0b1…),顺便说一下,它是一个非标准扩展,应该写成(0x…),被当作文本处理。然后,编译器会尽力将这些值适配到您将其强制转换到的变量中。因此,它会生成非常大的值,这些值等于文本的整数值

要直接分配变量的值,必须使用联合(或指针,如果您不介意失去一点可移植性的话)。此代码适用于:

#include <stdint.h>

union floatint {
    float f;
    uint32_t i;
};

union doubleint {
    double d;
    uint64_t i;
};    

int main()
{
  floatint floaty;
  doubleint doubley;
  floaty.i = 0xC3AB2200;
  doubley.i = 0xC075644000000000; 
  printf("Float: %f\n", floaty.f); // implementation-defined, in your case IEEE 754
  printf("Double: %lf\n", doubley.d); // ditto

}
#包括
联合浮点数{
浮动f;
uint32_t i;
};
并集双整型{
双d;
uint64_t i;
};    
int main()
{
漂浮的;
doubleint-doubley;
floaty.i=0xC3AB2200;
doubley.i=0xC075644000000000;
printf(“Float:%f\n”,floaty.f);//定义了实现,在您的例子中是IEEE 754
printf(“Double:%lf\n”,Double.d);//同上
}

请注意,这正是联合的定义,两个(或更多)类型共享相同的表示,但处理方式不同

问题在于编译器试图帮助您解决问题。您的文本(0b1…),顺便说一下,它是一个非标准扩展,应该写成(0x…),被当作文本处理。然后,编译器会尽力将这些值适配到您将其强制转换到的变量中。因此,它会生成非常大的值,这些值等于文本的整数值

要直接分配变量的值,必须使用联合(或指针,如果您不介意失去一点可移植性的话)。此代码适用于:

#include <stdint.h>

union floatint {
    float f;
    uint32_t i;
};

union doubleint {
    double d;
    uint64_t i;
};    

int main()
{
  floatint floaty;
  doubleint doubley;
  floaty.i = 0xC3AB2200;
  doubley.i = 0xC075644000000000; 
  printf("Float: %f\n", floaty.f); // implementation-defined, in your case IEEE 754
  printf("Double: %lf\n", doubley.d); // ditto

}
#包括
联合浮点数{
浮动f;
uint32_t i;
};
并集双整型{
双d;
uint64_t i;
};    
int main()
{
漂浮的;
doubleint-doubley;
floaty.i=0xC3AB2200;
doubley.i=0xC075644000000000;
printf(“Float:%f\n”,floaty.f);//定义了实现,在您的例子中是IEEE 754
printf(“Double:%lf\n”,Double.d);//同上
}
请注意,这正是联合的定义,两个(或更多)类型共享相同的表示,但处理方式不同

来自gcc:

这些常量的类型遵循与八进制或八进制相同的规则 十六进制整数常量,所以像'L'或'UL'这样的后缀可以是 应用

因此,您分配给float和double的二进制数实际上是整数类型,并且不会直接映射到您分配给的底层类型的位模式

换言之,这:

 float floaty = 0b11000011101010110010001000000000;
 double doubley = 0b1100000001110101011001000100000000000000000000000000000000000000;
相当于:

 float floaty = 3282772480;
 double doubley = 13868100853597995008;
来自gcc的:

这些常量的类型遵循与八进制或八进制相同的规则 十六进制整数常量,所以像'L'或'UL'这样的后缀可以是 应用

因此,您分配给float和double的二进制数实际上是整数类型,并且不会直接映射到您分配给的底层类型的位模式

换言之,这:

 float floaty = 0b11000011101010110010001000000000;
 double doubley = 0b1100000001110101011001000100000000000000000000000000000000000000;
相当于:

 float floaty = 3282772480;
 double doubley = 13868100853597995008;

您可以通过更多的工作来使用二进制常量

我们必须假设使用IEEE 754表示的浮点,且系统为little endian:

uint32_t value = 0b11000011101010110010001000000000;
float f;
memcpy( &f , &value , sizeof( f ) );
printf( "%f\n" , f );

您可以通过更多的工作来使用二进制常量

我们必须假设使用IEEE 754表示的浮点,且系统为little endian:

uint32_t value = 0b11000011101010110010001000000000;
float f;
memcpy( &f , &value , sizeof( f ) );
printf( "%f\n" , f );

0b
必须是gcc扩展。如果您能找到有关它如何与浮点初始化一起工作的文档,那就太好了。@CST-Link在C中打印
float
@CST-Link不重要了,后面的参数受默认参数提升的影响,这会将float提升为双精度。说明符f和lf对double或float有效。OP正在使用最好的选项。@CST链接
printf
格式
%f
用于
double
,任何
float
参数都将升级为
double
,方式与
%d
char
参数升级为
int
的方式相同。哈哈。。。显然我错了。。。谢谢大家打开我的眼睛。
0b
必须是一个gcc扩展。如果您能找到有关它如何与浮点初始化一起工作的文档,那就太好了。@CST-Link在C中打印
float
@CST-Link不重要了,后面的参数受默认参数提升的影响,这会将float提升为双精度。说明符f和lf对double或float有效。OP正在使用最好的选项。@CST链接
printf
格式
%f
用于
double
,任何
float
参数都将升级为
double
,方式与
%d
char
参数升级为
int
的方式相同。哈哈。。。显然我错了。。。谢谢大家打开我的眼睛。谢谢@LambdaBeta,有没有办法用我最初发布的二进制值来表达它们?指针转换(
float*
uint32\u t*
)是UB的起源。通常,一个
联合体
,如果编码得当,可以解决很多问题。没错,我把联合体和别名混在一起了,这很尴尬。这很有趣,因为我最初的测试可执行文件实际上使用了一个联合来证明代码可以工作,然后我使用别名重新编写了它,以便更加一致。它的并集是IB,别名是UB。我将编辑我的