我正在学习浮点数表示,我有以下 C++ 代码:
#include <float.h>
int main()
{
unsigned int a = 8;
float f = 1;
float fmax = FLT_MAX;
float n = 3.402823669e+38;
return 0;
}
当我像
f
一样在 gdb 中将 x/tw &f
的值打印为二进制时,我得到:
0 01111111 00000000000000000000000(1 个符号位,8 个表达式位,23 个尾数位)。
十六进制为 0x3f800000.
现在我想看看如果我使指数尽可能大,我会得到哪个数字。
所以我做
set *(&f) = 0x7f800000
.
然而,并没有得到预期的结果 0 11111111 00000000000000000000000,
我得到一些完全随意的东西,比如 0 10011101 11111110000000000000000, 这是 0x4eff0000,这不是我设置的值。
如果设置的结果不超过 FLT_MAX,也会发生这种情况。
以这种方式改变
unsigned int a
工作正常。
对这种行为有什么可能的解释?
对这种行为有什么可能的解释?
OP将
2139095040.0f
的值赋值给f
.
*(&f) = 0x7f800000
就像*(&f) = 2139095040.0f
.
2139095040.0f
以十六进制模式 0x4eff0000 的 float
编码。
毫不奇怪。