Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++ 将4字节整数解释为4字节浮点_C++ - Fatal编程技术网

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
value
1

您所做的是
重新解释
指向
int
的指针,指向
float
的指针,并通过转换的指针检索
float


一般来说,这是未定义的行为,但在您的计算机上,
int
float
具有相同的大小,并且表示
int
value
0x3f800000
的字节也表示
float
value
1
从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++实现,它们不相等,那么它们是如此罕见,如果您在一台计算机上运行上述代码,我希望您会知道。而且编译器没有执行基于类型的别名优化,编译器也没有执行基于类型的别名优化