Точный формат данных определяется используемым протоколом, но распространенные способы представления числовых данных:
Целое число без знака: на самом деле это самое простое. Его типичное представление в принципе работает как наша обычная десятичная система, за исключением того, что «цифры» являются байтами и могут иметь 256 различных значений.
Если вы посмотрите на десятичное число, например 3127, вы увидите три цифры. Наименее значащая цифра - последняя (в данном случае цифра 7). Наименее значимое означает, что если вы измените его на 1, вы получите минимальное изменение значения (а именно 1). Наиболее значимой цифрой в этом примере является цифра 3 слева: если вы измените эту цифру на 1, вы сделаете максимальное изменение значения, а именно изменение 1000. Поскольку имеется 10 различных цифр (от 0 до 9), число, представленное "3127", равно 3 * 10 * 10 * 10 + 1 * 10 * 10 + 2 * 10 + 7. Обратите внимание, что это просто условное обозначение, что наиболее значимая цифра стоит первой; Вы также можете определить, что наименьшая значащая цифра идет первой, а затем эта цифра будет записана как «7213».
Теперь в большинстве кодирований числа без знака работают точно так же, за исключением того, что "цифры" являются байтами, и поэтому вместо основания 10 у нас есть основание 256. Кроме того, в отличие от десятичных чисел, не существует универсального соглашения о том, является ли наиболее значимое байт (MSB) или младший байт (LSB) идет первым; оба соглашения используются в разных протоколах или форматах файлов.
Например, в 4-байтовом (то есть 32-битном) беззнаковом int с MSB сначала (также называемом кодированием с прямым порядком байтов), значение 1000 = 0 * 256 ^ 3 + 0 * 256 ^ 2 + 3 * 256 + 232 будет представлен четырьмя байтовыми значениями 0, 0, 3, 232
или шестнадцатеричным 00 00 03 E8
. Для кодирования с прямым порядком байтов (сначала LSB) это будет E8 03 00 00
. И как 16-битное целое число, это будет просто 03 E8
(с прямым порядком байтов) или E8 03
(с прямым порядком байтов).
Для целых чисел со знаком наиболее часто используемое представление - это дополнение к двум. По сути, это означает, что если старший значащий бит равен 1 (т. Е. Старший значащий байт равен 128 или больше), последовательность байтов не кодирует число, как написано выше, а вместо этого отрицательное число, полученное вычитанием 2 ^ (бит) отсюда, где (биты) - количество бит в числе. Например, в 16-битном int со знаком последовательность FF FF
не равна 65535, как это было бы в 16-битном целом без знака, а скорее 65535-2 ^ 16 = -1. Как и в случае беззнаковых целых, вы должны различать байты с прямым порядком байтов и байты с прямым порядком байтов. Например, -3 будет FF FD
в 16-битном порядке с прямым порядком байтов, но FD FF
в 16-битном порядке с прямым порядком байтов.
Плавающая точка немного сложнее; сегодня обычно используется формат, определенный IEEE / IEC. В основном числа с плавающей запятой имеют форму знака * (1.mantissa) * 2 ^ экспонента, а знак, мантисса и экспонента хранятся в разных подполях. Опять же, есть формы с прямым порядком байтов и с прямым порядком байтов.