Форматы чисел в компьютере: внутреннее представление данных, двоичное кодирование, целые и вещественные числа. Оптимизация для работы процессора и памяти.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Внутреннее представление числовых значений в цифровом компьютере
Internal representation of numeric values in a digital computer
Формат компьютерного числа – это внутреннее представление числовых значений в аппаратном и программном обеспечении цифрового устройства, такого как программируемые компьютеры и калькуляторы. Числовые значения хранятся в виде групп битов, например, байтов и слов. Кодировка, связывающая числовые значения и битовые шаблоны, выбирается для удобства работы компьютера; кодировка, используемая набором инструкций компьютера, как правило, требует преобразования для внешнего использования, например, для печати и отображения. Различные типы процессоров могут использовать разные внутренние представления числовых значений, и для целых и вещественных чисел применяются различные соглашения. Большинство вычислений выполняется с использованием форматов чисел, которые помещаются в регистр процессора, но некоторые программные системы позволяют представлять произвольно большие числа, используя несколько слов памяти.
A computer number format is the internal representation of numeric values in digital device hardware and software, such as in programmable computers and calculators. Numerical values are stored as groupings of bits, such as bytes and words. The encoding between numerical values and bit patterns is chosen for convenience of the operation of the computer; the encoding used by the computer's instruction set generally requires conversion for external use, such as for printing and display. Different types of processors may have different internal representations of numerical values and different conventions are used for integer and real numbers. Most calculations are carried out with number formats that fit into a processor register, but some software systems allow representation of arbitrarily large numbers using multiple words of memory.
Октальные и гексадецимальные цифры
Октальное и шестнадцатеричное кодирование – удобные способы представления двоичных чисел, используемые компьютерами. Компьютерным инженерам часто требуется записывать двоичные величины, но на практике запись двоичного числа, такого как 1001001101010001, утомительна и чревата ошибками. Поэтому двоичные величины записываются в системе с основанием 8, или "октальной", или, гораздо чаще, в системе с основанием 16, "шестнадцатеричной" (hex). В десятичной системе есть 10 цифр, от 0 до 9, которые комбинируются для формирования чисел. В октальной системе есть только 8 цифр, от 0 до 7. То есть, значение октального "10" равно десятичному "8", октального "20" – десятичному "16" и так далее. В шестнадцатеричной системе есть 16 цифр, от 0 до 9, за которыми, по соглашению, следуют буквы от A до F. То есть, шестнадцатеричное "10" равно десятичному "16", а шестнадцатеричное "20" – десятичному "32". Пример и сравнение чисел в различных системах счисления приведены в таблице ниже. При вводе чисел используются символы форматирования для указания системы счисления, например, 000 0000B или 0b000 00000 для двоичных чисел и 0F8H или 0xf8 для шестнадцатеричных чисел.
Octal and hexadecimal encoding are convenient ways to represent binary numbers, as used by computers. Computer engineers often need to write out binary quantities, but in practice writing out a binary number such as 1001001101010001 is tedious and prone to errors. Therefore, binary quantities are written in a base 8, or "octal", or, much more commonly, a base 16, "hexadecimal" (hex), number format. In the decimal system, there are 10 digits, 0 through 9, which combine to form numbers. In an octal system, there are only 8 digits, 0 through 7. That is, the value of an octal "10" is the same as a decimal "8", an octal "20" is a decimal "16", and so on. In a hexadecimal system, there are 16 digits, 0 through 9 followed, by convention, with A through F. That is, a hexadecimal "10" is the same as a decimal "16" and a hexadecimal "20" is the same as a decimal "32". An example and comparison of numbers in different bases is described in the chart below. When typing numbers, formatting characters are used to describe the number system, for example 000 0000B or 0b000 00000 for binary and 0F8H or 0xf8 for hexadecimal numbers.
Числа фиксированной точки
Форматирование с фиксированной точкой может быть полезно для представления дробей в двоичном виде. Количество битов, необходимое для желаемой точности и диапазона, должно быть выбрано для хранения дробной и целой частей числа. Например, используя 32-битный формат, 16 бит могут быть использованы для целой части и 16 для дробной. За битом 8 следует бит 4, затем бит 2, затем бит 1. Дробные биты продолжают закономерность, заданную целыми битами. Следующий бит – это бит ½, затем бит ¼, затем бит ⅛, и так далее. Например:
биты целой части биты дробной части 0.500 = = 00000000 00000000.10000000 00000000 1.250 == 00000000 00000001.01000000 00000000 7.375 == 00000000 00000111.01100000 00000000
Эта форма кодирования не может представить некоторые значения в двоичном виде. Например, для дроби 0.2 в десятичной системе, наиболее близкие приближения будут следующими:
13107 / 65536 = 00000000 00000000.00110011 00110011 = 0.1999969 в десятичной системе 13108 / 65536 = 00000000 00000000.00110011 00110100 = 0.2000122 в десятичной системе
Fixed point formatting can be useful to represent fractions in binary. The number of bits needed for the precision and range desired must be chosen to store the fractional and integer parts of a number. For instance, using a 32 bit format, 16 bits may be used for the integer and 16 for the fraction. The eight's bit is followed by the four's bit, then the two's bit, then the one's bit. The fractional bits continue the pattern set by the integer bits. The next bit is the half's bit, then the quarter's bit, then the ⅛'s bit, and so on. For example:
integer bits fractional bits 0.500 = = 00000000 00000000.10000000 00000000 1.250 == 00000000 00000001.01000000 00000000 7.375 == 00000000 00000111.01100000 00000000
This form of encoding cannot represent some values in binary. For example, the fraction , 0.2 in decimal, the closest approximations would be as follows:
13107 / 65536 = 00000000 00000000.00110011 00110011 = 0.1999969 in decimal 13108 / 65536 = 00000000 00000000.00110011 00110100 = 0.2000122 in decimal
Даже если использовать больше знаков, точное представление невозможно. Число, записанное в десятичной системе как 0.333333333, продолжается бесконечно. Если его прервать преждевременно, значение не будет точным.
Even if more digits are used, an exact representation is impossible. The number , written in decimal as 0.333333333 , continues indefinitely. If prematurely terminated, the value would not represent precisely.
Числа в языках программирования
Программирование на языке ассемблера требует от программиста отслеживать представление чисел. Если процессор не поддерживает необходимую математическую операцию, программист должен разработать подходящий алгоритм и последовательность инструкций для её выполнения; на некоторых микропроцессорах даже целочисленное умножение приходится выполнять программно. Языки программирования высокого уровня, такие как Ruby и Python, предоставляют абстрактное число, которое может быть расширенным типом, например, рациональным числом, биг-интом или комплексным числом. Математические операции выполняются библиотечными функциями, предоставляемыми реализацией языка. Определенный математический символ в исходном коде, благодаря перегрузке операторов, вызывает различный машинный код, соответствующий представлению числового типа; математические операции над любым числом – будь то знаковое, беззнаковое, рациональное, с плавающей точкой, с фиксированной точкой, целое или комплексное – записываются одинаково. Некоторые языки, такие как REXX и Java, предоставляют операции с десятичной точкой с плавающей запятой, которые приводят к ошибкам округления другого типа.
Programming in assembly language requires the programmer to keep track of the representation of numbers. Where the processor does not support a required mathematical operation, the programmer must work out a suitable algorithm and instruction sequence to carry out the operation; on some microprocessors, even integer multiplication must be done in software. High level programming languages such as Ruby and Python offer an abstract number that may be an expanded type such as rational, bignum, or complex. Mathematical operations are carried out by library routines provided by the implementation of the language. A given mathematical symbol in the source code, by operator overloading, will invoke different object code appropriate to the representation of the numerical type; mathematical operations on any number—whether signed, unsigned, rational, floating point, fixed point, integral, or complex—are written exactly the same way. Some languages, such as REXX and Java, provide decimal floating points operations, which provide rounding errors of a different form.