gpt4 book ai didi

c++ - float 的长度在 32 和 40 位之间变化

转载 作者:IT老高 更新时间:2023-10-28 12:52:53 26 4
gpt4 key购买 nike

我在将 float 值导出到文件时遇到了一个奇怪的问题。我希望每个 float 都具有相同的长度(显然),但我的程序有时将其导出为 32 位数,有时导出为 40 位数。仍然显示此行为的程序的最小工作示例是:

#include <stdio.h>

const char* fileName = "C:/Users/Path/To/TestFile.txt";
float array [5];

int main(int argc, char* argv [])
{
float temp1 = 1.63006e-33f;
float temp2 = 1.55949e-32f;

array[0] = temp1;
array[1] = temp2;
array[2] = temp1;
array[3] = temp2;
array[4] = temp2;

FILE* outputFile;
if (!fopen_s(&outputFile, fileName, "w"))
{
fwrite(array, 5 * sizeof(float), 1, outputFile);
fclose(outputFile);
}

return true;
}

我希望输出文件恰好包含 20(5 乘以 4)字节,每四个字节代表一个 float 。但是,我明白了:

 8b 6b 07 09      // this is indeed 1.63006e-33f 
5b f2 a1 0d 0a // I don't know what this is but it's a byte too long
8b 6b 07 09
5b f2 a1 0d 0a
5b f2 a1 0d 0a

所以浮点 temp2 占用了 5 个字节而不是 4 个字节,而 he 文件的总长度是 23。这怎么可能?!这个数字并没有小到低于正常数字,而且我想不出任何其他原因会导致大小有所不同。

我在 64 位 Windows 7 系统上使用 MSVC 2010 编译器。

注意: 我已经在这里问了一个非常相似的问题,但是当我意识到这个问题更普遍时,我决定以更简洁的方式重新发布。 QDataStream uses sometimes 32 bit and sometimes 40 bit floats

最佳答案

问题在于,在 Windows 上,您必须区分文本文件和二进制文件。您将文件作为文本打开,这意味着在每个 0a (换行符)写入之前插入 0d (回车)。像这样打开文件:

if (!fopen_s(&outputFile, fileName, "wb"))

其余的和以前一样,它应该可以工作。

关于c++ - float 的长度在 32 和 40 位之间变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15768405/

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