gdb 在浮点数的地址设置值

问题描述 投票:0回答:1

我正在学习浮点数表示,我有以下 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
工作正常。

对这种行为有什么可能的解释?

c++ memory floating-point gdb
1个回答
0
投票

对这种行为有什么可能的解释?

OP将

2139095040.0f
的值赋值给
f
.


*(&f) = 0x7f800000
就像
*(&f) = 2139095040.0f
.

2139095040.0f
以十六进制模式 0x4eff0000 的
float
编码。

毫不奇怪。

© www.soinside.com 2019 - 2024. All rights reserved.