gpt4 book ai didi

c++ - 将 double 的位模式显示为十六进制?

转载 作者:太空狗 更新时间:2023-10-29 23:48:46 26 4
gpt4 key购买 nike

我正在尝试使用 printf 将 double 的二进制表示形式打印到控制台上。这是我到目前为止的代码:

#include <stdio.h>

int main()
{
double a = 4.75;
unsigned long long b = *(unsigned long long *) &a;
printf("Double a = %f (0x%x)" a, b);
}

我还尝试将它从 long long 更改为 long。这是我在 gcc linux 中执行此操作的结果:

Double a = 4.750000 (0x0)

我很确定,因为我的系统是小字节序的,所以它只抓取全为零的前 32 位。但是,我不确定如何解决这个问题。

我认为这可能是因为 long 在 linux 中是 64 位的,但在测试之后我再次得到了相同的结果。也许我打印不正确?不确定,让我知道并感谢您抽出时间。

最佳答案

您的代码有两个问题,一个简单的问题是您使用了错误的格式说明符 %llxunsigned long long 的正确说明符。 clang 和 gcc 都为此使用 -Wall 提供警告,see it live .

第二个问题是您违反了 strict aliasing rule这里:

unsigned long long b = *(unsigned long long *) &a;

输入双关语的正确方法(在 C 和 C++ 中)是使用 memcpy (see it working live):

std::memcpy( &b, &a, sizeof(double));

在 C++20 注释上面的严格别名链接中,我们应该得到 bit_cast,这将简化类型双关,例如:

b = bit_cast<unsigned long long>(a);

关于c++ - 将 double 的位模式显示为十六进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53184403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com