C++有浮子的Memcpy

Memcpy with floats in C++

本文关键字:Memcpy C++      更新时间:2023-10-16

我对看似非常简单的代码有问题,但它确实做了我期望它做的事情:

法典:

char b[sizeof(float)];
float a = 1.5f;
memcpy(b, &a, sizeof(float));
printf("%fn", b[0]);

输出:

62827075002794546937726511559700164562271693617156259118887055013962964939146547
22493354730179062365918845182857228200743453702107162763566167344423902681816648
14169764096333089859051972349071751428406066879715295195780847944297207011246001
33742258486014791122944.000000

然而,当我这样做时,它有效:

char b[sizeof(int)];
int a = 3;
memcpy(b, &a, sizeof(int));
printf("%in", b[0]);

输出:

3

为什么会这样?是因为字节序还是什么?

您的代码具有未定义的行为。表达式 b[0] 是一个char(提升为 int ),格式说明符%f需要double

(对于您看到的输出,可以有多种解释。想到的最紧迫的问题是double比平台上的int宽,并且会读取垃圾内存。如果你想要一个稍微更可预测的实验,请尝试传递static_cast<uint64_t>(b[0])作为参数。