C++ 将4字节整数解释为4字节浮点
看看这个简单的程序:C++ 将4字节整数解释为4字节浮点,c++,C++,看看这个简单的程序: #include <iostream> using namespace std; int main() { unsigned int i=0x3f800000; float* p=(float*)(&i); float f=*p; cout<<f; } 不要期望从这段代码中得到任何东西。(float*)(&i)的行为未定义,因为指针类型不相关 float和int甚至可能大小不一样。您可能正在开发一种将float和int存储在内存中完全不同
#include <iostream>
using namespace std;
int main()
{
unsigned int i=0x3f800000;
float* p=(float*)(&i);
float f=*p;
cout<<f;
}
不要期望从这段代码中得到任何东西。
(float*)(&i)的行为代码>未定义,因为指针类型不相关
float
和int
甚至可能大小不一样。您可能正在开发一种将float
和int
存储在内存中完全不同位置的体系结构。甚至有可能sizeof(float*)
与sizeof(int*)
不同。不太可能,但可能。不要期望从这段代码中得到任何东西。(float*)(&i)的行为代码>未定义,因为指针类型不相关
float
和int
甚至可能大小不一样。您可能正在开发一种将float
和int
存储在内存中完全不同位置的体系结构。甚至有可能sizeof(float*)
与sizeof(int*)
不同。不太可能,但可能。您所做的是将指向int
的指针重新解释为指向float
的指针,并通过转换的指针检索float
值
一般来说,这是未定义的行为,但在您的计算机上,int
和float
具有相同的大小,并且表示int
值的字节数0x3f800000
,还表示float
value1
您所做的是重新解释指向int
的指针,指向float
的指针,并通过转换的指针检索float
值
一般来说,这是未定义的行为,但在您的计算机上,int
和float
具有相同的大小,并且表示int
value0x3f800000
的字节也表示float
value1
从int到float的转换是错误的。
你必须这样做:
unsigned int i=0x3f800000;
float f=(float)i;
cout<<f;
无符号整数i=0x3f800000;
浮点数f=(浮点数)i;
cout从int到float的转换是错误的。
你必须这样做:
unsigned int i=0x3f800000;
float f=(float)i;
cout<<f;
无符号整数i=0x3f800000;
浮点数f=(浮点数)i;
库特
因此,我希望在输出中看到0x3f800000
,但它会打印1
。为什么?
ap1019@sharifvm:~$ ./a.out
1
ap1019@sharifvm:~$
因为0x3f800000
具有位模式00111100000000000000000000000
,如果根据读取,则表示浮点1.0
因此,我希望在输出中看到0x3f800000
,但它会打印1
。为什么?
ap1019@sharifvm:~$ ./a.out
1
ap1019@sharifvm:~$
因为0x3f800000
具有位模式00111100000000000000000000000
,如果根据读取,则表示浮点1.0
在您的实现中,表示1065353216
为整数(3f800000
为十六进制)的位模式表示1
为浮点。在所有C++实现中,这并不是保证的,尽管它是常见的,因为它是表示代码< 1 >代码>的32位IEEE 754浮点的比特模式。
还要注意,您的代码违反了严格的别名,因此无论位模式如何,都有未定义的行为。表示1065353216
为整数(3f800000
十六进制)的位模式在实现中表示1
为浮点。在所有C++实现中,这并不是保证的,尽管它是常见的,因为它是表示代码< 1 >代码>的32位IEEE 754浮点的比特模式。
还要注意,您的代码违反了严格的别名,因此无论位模式如何,都有未定义的行为。如果您打印出一个浮点,您应该看到一个浮点,而不是十六进制。用浮子f=静态施法(i)和浮子f=*重新解释施法(&i)进行试验;我们刚才不是有这个问题吗yesterday@MattMcNabb我真的不知道,正如你所知道的,在这个标签中,每天大约有80个问题被问到!:)我还没问过你为什么期望0x3f800000而不是1065353216?@molbdnilo它们之间有什么区别吗?如果你打印出一个浮点,你应该期望看到一个浮点,而不是十六进制。用浮子f=静态施法(i)和浮子f=*重新解释施法(&i)进行试验;我们刚才不是有这个问题吗yesterday@MattMcNabb我真的不知道,正如你所知道的,在这个标签中,每天大约有80个问题被问到!:)我没有问过为什么你期望0x3F8000而不是1065353216?@ MulbDNILO之间有什么区别吗?C++不强制执行IEEE 754,虽然图片很漂亮。@ Bathsheba,但这不是被问到的。C++不强制执行IEEE 754,不过画面很美。@Bathsheba,但这并不是我们要问的。float和int的大小可能都不一样。您可能正在开发一种体系结构,它将float和int存储在内存中完全不同的位置,但内存地址大小相同,对吗?(即,32位或64位)@亚伯拉罕:标准实际上不需要,<代码> siZeof(int *)= sisif(浮点*)< />代码,但是如果有任何C++实现,它们不相等,那么它们非常罕见,如果您在ON上运行上面的代码,我希望您会知道它。您可能正在开发一种体系结构,它将float和int存储在内存中完全不同的位置,但内存地址大小相同,对吗?(即,32位或64位)@亚伯拉罕:标准实际上不要求<代码> siZeof(int *)= sisif(浮点*)< />代码,但是如果有任何C++实现,它们不相等,那么它们是如此罕见,如果您在一台计算机上运行上述代码,我希望您会知道。而且编译器没有执行基于类型的别名优化,编译器也没有执行基于类型的别名优化