以下问题让我很困惑:
我正在试验如何doubles
,尤其是它们的“特殊”值,例如PositiveInfinity
存储在文件中,这没问题。我通过三个简单的步骤完成了这项工作double
:将其写入文件;将文件读入byte
-array。这很容易,现在我知道Double.NaN
二进制格式的 a 是什么样子了 :)
但后来我遇到了以下情况:
根据.Net-Framework,有一个NegativeZero
:
internal static double NegativeZero = BitConverter.Int64BitsToDouble(unchecked((long)0x8000000000000000));
它的表示方式非常简单(遵循 IEEE 754):
代表一个二进制数:long
10000000...
第一个位表示double
是负数。因此,代表 的NegativeZero
是- 0 * 2^0
尾数和指数都是0
。
表示“正常” 0 将是 64 位全部设置为0
.
但问题是将这些数字读入byte
数组。我的假设是NegativeZero
:128
0
0
... [二进制:100000 ...]
但实际上它是错误的方式:0
0
...... 128
![二进制:00000...0 10000000]
我的第一个想法是:“可能File.ReadAllBytes()
以错误的顺序返回所有东西(这会很尴尬)”。所以我决定用一个string
(->用一个字符串创建一个文件;将它读入byte
数组)来测试阅读器
结果很好:byte
数组中的“Hello”仍然是“Hello”,而不是上面的示例中提出的“olleH”。
再次简而言之:
将二进制数(10000000 00000000 00000000)写入文件可以正常工作。
将相同的二进制数读入byte
数组结果是:
[0]00000000
[1]00000000
[2]10000000
读取文件不会是问题,因为strings
保持不变。
但是:将byte
数组解释回原始变量(long,double ...)会返回正确的结果。
因此,从我看来,bytes
变量的存储顺序错误。
这是真的?如果是这样,为什么要这样做,因为在我看来它似乎违反了 IEEE 754(但它显然有效)?
如果我在这里遗漏任何东西,请纠正我,因为经过数小时搜索此问题的答案后我仍然感到困惑......