Преобразование массива с плавающей запятой в байт

Мы используем

float f= 3.5f ;
BitConverter.GetBytes(f);

Он возвращает массив байтов длиной 4. Но мне интересно, что за этим стоит математика. Кто-нибудь научит математике этого преобразования? Также приветствуется информация о двойном преобразовании.


person Community    schedule 26.10.2017    source источник
comment
здесь нет математики или преобразования, просто копия памяти referencesource.microsoft. com/#mscorlib/system/. en.wikipedia.org/wiki/Single-precision_format_floating-point   -  person Slai    schedule 27.10.2017
comment
Я называл их дело математикой. Спасибо.   -  person    schedule 27.10.2017
comment
официальная документация немного умалчивает о фактической семантике GetBytes(). Вероятно, это потому, что авторы считали само собой разумеющимся, что возвращаемое значение — это просто байты, с помощью которых значение аргумента представлено или сохранено в памяти. Число с плавающей запятой и двойное число представляются с использованием [...] форматов IEEE 754. (Спецификация языка CSharp 5.0, 1.3)   -  person Peter - Reinstate Monica    schedule 27.10.2017


Ответы (1)


Под прикрытием он использует небезопасные указатели в стиле C для копирования базового 32-битного значения в 32-битный массив (a byte[4]):

int rawBits = *(int*)&value;
byte[] bytes = new byte[4];
fixed(byte* b = bytes)
    *((int*)b) = rawBits;
return bytes;

Результаты зависят от архитектуры, поскольку порядок байтов соответствует порядку байтов памяти (порядку следования байтов) машины, на которой было выполнено копирование.

Например, если 32-битное значение rawBits равно 0xAABBCCDD, а в памяти оно представлено как AA BB CC DD, то массив будет содержать 0xAA, 0xBB, 0xCC, 0xDD. Если представление в памяти было DD CC BB AA, то массив будет содержать 0xDD, 0xCC, 0xBB, 0xAA.

person Mike Strobel    schedule 26.10.2017