我不确定我是否遗漏了一些简单但下面的代码失败(a和b的含义相同):
a=single(2147483584)
f=fopen('test','wb');
fwrite(f,a,'int32')
fclose(f);
f=fopen('test','rb');
b=fread(f,inf,'int32');
fclose(f)
a
b
带输出:
a =
2.1475e+009
b =
-2.1475e+009
并且以下代码成功:
a=single(2147483583)
f=fopen('test','wb');
fwrite(f,a,'int32')
fclose(f);
f=fopen('test','rb');
b=fread(f,inf,'int32');
fclose(f)
a
b
带输出:
a =
2.1475e+009
b =
2.1475e+009
有谁知道为什么?
答案 0 :(得分:3)
我不太了解Matlab,但似乎很清楚这里发生了什么。您正在将a
转换为float,然后将该转换的结果存储为32位有符号整数。但最接近整数2147483584
的单精度IEEE 754浮点数为2147483648.0
或2**31
。 32位整数只能表示范围[-2**31, 2**31-1]
中的值,因此看起来好像将此值写为整数时,它会被模2**32
换行以提供-2**31
而不是2**31
。
相比之下,最接近2147483583
的单精度浮点数为2147483520.0
,其中 符合32位整数。