Представление целых чисел в памяти компьютера: «Представление чисел в памяти компьютера»

Содержание

Представление чисел в памяти компьютера. | Презентация к уроку по информатике и икт (8 класс):

Слайд 1

«ПРЕДСТАВЛЕНИЕ ЧИСЕЛ В ПАМЯТИ КОМПЬЮТЕРА»

Слайд 2

Повторение: Переведите двоичные числа в десятичную: А)101101; б) 110010 2. Переведите десятичные числа в двоичные: А) 55; б) 89

Слайд 3

ПРЕДСТАВЛЕНИЕ ЦЕЛЫХ ЧИСЕЛ Все числа в компьютере представляются в виде двоичных кодов, т.е нулей и единиц . Элементы числа, называют разрядами или битами. Память компьютера условно делиться на ячейки, каждая из которых имеет свой номер. Нумерация начинается с нуля(справа налево). Минимальной адресуемой ячейкой памяти называется байт – 8 двоичных разрядов. порядковый номер байта называется его адресом . Наибольшую последовательность битов, которую процессор может обрабатывать как единое целое, называют машинным словом . Длина машинного слова может быть разной - 8 , 16 , 32 бит и т.д.

Слайд 4

Целочисленный формат (формат с фиксированной точкой) используется для представления в компьютере целых положительных и отрицательных чисел. Для представления в компьютере положительных и отрицательных чисел существуют правила. Под знак отводится старший разряд ячейки: 0 - для положительных чисел, 1 - для отрицательных чисел.

Слайд 5

Для положительного числа прямой, обратный и дополнительный коды выглядят одинаково. Прямой код двоичного числа — это само двоичное число, причем значение знакового разряда для положительных чисел равно 0, а для отрицательных чисел -1 . Обратный код отрицательного числа получается из прямого кода путем замены нулей единицами, а единиц нулями, исключая знаковый разряд. Дополнительный код отрицательного числа образуется как результат суммирования обратного кода с единицей младшего разряда. Перенос в знаковый разряд при этом теряется.

Слайд 6

Пример 1. Определить прямой, обратный и дополнительный коды следующих двоичных чисел: а)111000; б) -111011; в) -100010. Решение Будем считать, что число размещается в 16 битах (2 байтах) . Старший бит – знак разряда. Незначащие нули добавляются слева от числа. Результат представим в виде таблицы: Число Прямой код Обратный код Дополнительный код 111000 0000000000111000 0000000000111000 0000000000111000 -111011 1000000000111011 1111111111000100 1111111111000101 -100010 1000000000100010 1111111111011101 1111111111011110

Слайд 7

Пример 2. Как будет представлено в памяти компьютера целое число 12345 10 ? Решение Для размещения числа возьмем два байта. Поскольку число положительное, то в старшем (15-м) бите будет 0. Переведем число в двоичную систему счисления: 12345 10 = 11000000111001 2 . Результат: 0 0110000 00111001 Знак числа число

Представление целых чисел в памяти компьютера

Вся информация, обрабатываемая современными компьютерами, хранится в них в двоичном виде. Каждый элемент ячейки служит для изображения одного разряда двоичного числа. Именно поэтому каждый элемент ячейки называют разрядом.
Способы представления: 
  • Беззнаковое используют только для неотрицательных целых чисел
  • Знаковое используют для отрицательных и положительных чисел 
Беззнаковое представление целых положительных чисел в компьютере
Чтобы получить представление целого положительного числа в компьютере, это число необходимо перевести в двоичную систему счисления.
Если двоичное число состоит не более чем из k цифр, то это число можно записать в k-разрядной ячейке памяти, дополнив нулями слева до k разрядов.
Знаковое представление целых чисел в компьютере


При знаковом представлении чисел 0 в самом левом разряде ячейки соответствует знаку плюс, а единица – знаку минус. Такое представление чисел называется прямым кодом.
Однако для представления отрицательных чисел в компьютере используется дополнительный код.
  • количество представимых чисел в k разрядах ограничено и зависит от k;
  • диапазон знаковых чисел, представимых в k-разрядной ячейке, не симметричен относительно 0.
Алгоритм построения дополнительного кода
Для k-разрядной ячейки дополнительный код отрицательного числа можно получить следующим образом:
  • Модуль числа представляется прямым кодом в k разрядах.
  • В прямом коде все нули заменяются на единицы, а единицы – на нули. Таким образом получаем обратный код.
  • К полученному обратному коду прибавляется единица.

Иногда требуется по имеющемуся дополнительному коду числа восстановить исходное число. Модуль искомого числа в таком случае можно получить двумя способами:


  • Провести обратную цепочку преобразований: вычесть единицу из дополнительного кода числа, инвертировать полученный результат и перевести его в десятичную систему счисления.
  • Построить дополнительный код для имеющегося дополнительного кода и перевести результат в десятичную систему счисления.

Перечисление целых знаковых чисел
Расположим целые знаковые числа, которые можно записать в 8-разрядах, в порядке возрастания на числовой оси:

Если мы хотим прибавить к какому-либо числу единицу, то сдвигаемся по этой оси вправо.

Если мы хотим отнять от какого-либо числа единицу, то сдвигаемся влево.

В k-разрядной компьютерной арифметике все целые числа расположены по кольцу, причем рядом с максимальным расположено минимальное в конкретном представлении.

В связи с тем, что количество чисел, которые могут быть представлены в k разрядах, ограничено, при выполнении арифметических действий в целочисленной k-разрядной арифметике могут возникнуть следующие ситуации:

  • Старшие цифры результата могут выйти за пределы отведенных разрядов и будут утеряны.
  • При сложении или умножении двух положительных знаковых чисел можно получить отрицательное число.
Это произойдет в том случае, если в результате вычисления в знаковом бите окажется единица. Подобные ситуации могут привести к неверному результату при выполнении верных алгоритмов. Поэтому об этих особенностях всегда нужно помнить при программировании.

Представление вещественных чисел в памяти компьютера — Студопедия

Рассматриваемая тема не обязательно связана с объединением, она представляет также самостоятельный интерес. Здесь этот материал нужен для понимания некоторых примеров этого и последующих параграфов.

Вещественное число (число с плавающей запятой) состоит из двух частей: мантиссы и порядка. Например, число в десятичной системе счисления 0,000123 можно записать одним из следующих способов: 0.0000123*10; 0,123*10-3; 1,23*10-4 и т.д. Аналогично 78900=0,789*105=78,9*103 и т.д. Термин “число с плавающей запятой” и связан с тем, что десятичная запятая перемещается (плывёт) по числу. Из такого рода различных записей в десятичной системе счисления нас будет интересовать нормализованное число, соответственно 0,123*10-3 и 0,789*105. Первая его часть называется

мантиссой (0,123 и 0,789), а числа -3 и 5 – порядком.

Аналогично различные варианты записи (на бумаге, а не в памяти компьютера) вещественного числа имеют место и в двоичной системе счисления. Например, рассмотрим десятичное число 12,375. Для его перевода в двоичную систему счисления отдельно переводим целую часть (см. гл. 4 файла Lections1Semestr) и отдельно дробную часть. В качестве вспомогательной системы счисления можно использовать шестнадцатеричную. Для перевода дробной части из 10 с.с в 16 с.с выполняем следующее:


дробную часть числа умножаем на 16;

полученную целую часть результата (число от 0 до 15) переводим в 16-ю с.с и берём в качестве первой после запятой 16-й цифры результата;

дробную часть результата, если она не равна нулю, повторно умножаем на 16;

полученную целую часть переводим в 16-ю с. с и берём в качестве следующей 16-й цифры;

дробную часть результата снова умножаем на 16;

это продолжаем, пока не наступит одна из следующих ситуаций:

a) на некотором шаге, не обязательно в самом начале, получим в дробной части нуль. В этом случае перевод выполнили точно. Это имеет место в нашем примере: 0,375*16=6.0;

b) получим в дробной части число, которое было раньше. Например, 0,15*16=2,4; 0,4*16=6,4. Если продолжать умножение 0,4*16, будем получать одно и то же, т. е 6,4. В таком случае получаем следующий результат: 0,1510= 0,2666…16=0,2(6)16. Круглые скобки означают, что записанное в них одно или несколько разных чисел будут повторяться бесконечное число раз. Говорят, что это число в периоде, т.е. 6 в периоде;

c) если не получаем ни нуль, ни повторяющиеся числа, то ограничиваемся заданным предварительно количеством двоичных или шестнадцатеричных цифр. Для числа типа float необходимо получить 24 двоичные цифры, считая от первой значащей, или не менее 7 шестнадцатеричных цифр, не считая первые 16-е нули.


Для перевода дробной части из 16-й в 2-ю с.с. записываем каждую 16-ю (но не 10-ю!) цифру в виде тетрады, т.е. четырёх двоичных цифр. Получим 12.37510=С.6

16=1100,0110. При этом последнюю цифру ‘0’ можем не писать. Как и в 10-й с.с., этот нуль незначащий. Остальные нули рядом с десятичной запятой обязательны!

Это двоичное число, как и в 10-й с.с., записать можно по-разному: 11,00011*22; 1100011*2-3; 1.100011*23. Из приведенных вариантов нас будет интересовать последняя нормализованная запись, в которой в целой части записана одна первая значащая единица. Получим: m= памяти не хранится, но 1.100011; p=310=112, где m —нормализованная мантисса, p — порядок в 2 с.с.

Пусть число объявлено как float. Тогда 4 байта (32 бита) распределяются следующим образом:

один самый “левый” бит отводится под знак мантиссы, или, что то же самое, под знак всего числа. Записывается 0, если мантисса, а, значит и само вещественное число, положительное, и 1 в противном случае. Никакого дополнительного кода для отрицательного вещественного числа, как это было для целых чисел, получать не надо;

следующие 8 разрядов (бит) занимает изменённый порядок записи числа в 2-й с.с., который называется

характеристикой числа. Обозначим её x. Знак порядка нигде не хранится. Чтобы он всегда был неотрицательным, порядок увеличивается на 12710, т. е. x=p+12710=p+7F16. (1)

Для нашего примера здесь будет храниться число x=310+12710= 13010=8216=100000102. Это же можно вычислить и так: x=316+7F16=8216 =100000102 ;

последние 23 (32-1-8) разряда занимает мантисса. При этом целая её часть, равная 1, в памяти не хранится, но учитывается при вычислениях. Если дробная часть числа переведена в 16-ю, а, значит и в двоичную с. с не точно, т. е. имели место варианты b) и c) (см. выше перевод), последняя 2-я цифра округляется по обычным правилам. Если первая отбрасываемая 2-я цифра равна 1, то прибавляем двоичную единицу, в противном случае оставляем без изменения.

Таким образом, число 12,375 в формате float будет представлено следующим образом: 01000001010001100000000000000000. Иногда в литературе можно встретить шестнадцатеричную запись этого результата: 4146000016.

Упражнение. Представить число -0.01 как число с плавающей точкой в формате float.

Переводим модуль числа в шестнадцатеричную, а затем в двоичную системы счисления описанным выше способом:

0.01= 0.028F5С28F5C…16=0.0(28F5С)16=0.0000001010001111010111000010100…2.

Так как под мантиссу отводится 23 разряда, то должны получить 25 двоичных цифр, не считая первых после десятичной точки подряд идущих нулей. Почему? По правилу нормализации самая первая значащая единица (в примере в десятичной цифре 2) в память не записывается, а ещё одна дополнительная двоичная цифра нужна для того, чтобы определить, как округлять число. Так как первая отбрасываемая двоичная цифра =0, то получаем

m=0.010001111010111000010102.

Если число “маленькое”, т.е. целая часть =0, а в дробной части после запятой несколько подряд идущих нулей, то получим отрицательный порядок. Так как 0.0000001010001111010111000010102 = 1.01000111101011100001010*2-7,

то p=-710=-716, x= p+7F16=7F16-716=7816=011110002.

В результате получим ответ: 10111100001000111101011100001010.

Рассмотрим обратную задачу. Пусть в ячейке размером 4 байта хранится следующая последовательность нулей и единиц, шестнадцатеричное представление которой такое: С215999A16. Известно, что здесь хранится вещественное число, т.е. в программе записано, например, объявление: float a. Что это за число в 10-й системе счисления?

Для ответа на этот вопрос в обратном порядке выполняем действия, описанные выше.

1) Запишем двоичное представление числа: 11000010000101011001100110011010.

2) Единица в старшем бите (самая “левая”) означает, что всё вещественное число отрицательное.

3) В следующих 8 битах находится характеристика числа, т.е. x=100001002=8416. Из формулы (1) получаем двоичный порядок числа: p=x-7F16=8416-7F16 =516=510.

4) Из последних 23 разрядов получаем m=0.001010110011001100110102.

5) Поэтому искомое число

a=1.00101011001100110011010*25=100101.0110011001100110102@25.(6) 16@37.410.

Перевод дробной части выполняли следующим образом:

0.(6) 16 = 0.6666616 = 6*16-1+6*16-2+6*16-3+6*16-4+6*16-5@0.410.

Т.к. это отрицательное число, то получаем ответ: - 37.410

5. 2. Объявление объединения.(+)

Объявление типа объединения, которые ещё называют смеси, похоже на объявление структурного типа. Только вместо ключевого слова struct используется union. Как и для структурной переменной, возможны три способа объявления переменной типа объединения: раздельное, совместное и анонимное (см. 1.1).

Для изучения объединения сначала рассмотрим следующий код для работы со структурой.

Представление чисел в компьютере. Представление целых и вещественных чисел в памяти компьютера

Любому, кто хоть раз задумывался в жизни о том, чтобы стать "айтишником" или системным администратором, да и просто связать судьбу с вычислительной техникой, знание о том, как происходит представление чисел в памяти компьютера, абсолютно необходимо. Ведь именно на этом основываются языки программирования низкого уровня, такие как Assembler. Поэтому сегодня мы рассмотрим представление чисел в компьютере и их размещение в ячейках памяти.

Система счисления

Если вы читаете данную статью, то, скорее всего, уже знаете об этом, но повторить стоит. Все данные в персональном компьютере хранятся в двоичной системе счисления. Это означает, что любое число необходимо представить в соответствующей форме, то есть состоящим из нулей и единиц.

Чтобы перевести привычные для нас десятичные числа к виду, понятному компьютеру, нужно воспользоваться описанным ниже алгоритмом. Существуют и специализированные калькуляторы.

Итак, для того чтобы перевести число в двоичную систему счисления, нужно взять выбранное нами значение и поделить его на 2. После этого мы получим результат и остаток (0 или 1). Результат опять делим 2 и запоминаем остаток. Данную процедуру нужно повторять до тех пор, пока в итоге также не окажется 0 или 1. Затем записываем конечное значение и остатки в обратном порядке, как мы их получали.

Именно так и происходит представление чисел в компьютере. Любое число записывается в двоичной форме, а потом занимает ячейку памяти.

Память

Как вам должно быть уже известно, минимальная единица измерения информации составляет 1 бит. Как мы уже выяснили, представление чисел в компьютере происходит в двоичном формате. Таким образом, каждый бит памяти будет занят одним значением – 1 или 0.

Для хранения больших чисел используются ячейки. Каждая такая единица содержит до 8 бит информации. Поэтому можно сделать вывод, что минимальное значение в каждом отрезке памяти может составлять 1 байт или быть восьмизначным двоичным числом.

Целые

Наконец мы подобрались к непосредственному размещению данных в компьютере. Как было уже сказано, первым делом процессор переводит информацию в двоичный формат, а только затем размещает в памяти.

Начнем мы с самого простого варианта, коим является представление целых чисел в компьютере. Память ПК отводит под этот процесс до смешного малое количество ячеек – всего одну. Таким образом, максимум в одном слоте могут быть значения от 0 до 11111111. Давайте переведём максимальное число в привычную нам форму записи.
Х = 1 × 27 + 1 × 26 + 1 × 25 + 1 × 24 + 1 × 23 + 1 × 22 + 1 × 21 + 1 × 20 = 1 × 28 - 1 = 255.

Теперь мы видим, что в одной ячейке памяти может располагаться значение от 0 до 255. Однако это относится исключительно к целым неотрицательным числам. Если же компьютеру понадобится записать отрицательное значение, всё пройдет немного по-другому.

Отрицательные числа

Теперь давайте посмотрим, как происходит представление чисел в компьютере, если они являются отрицательными. Для размещения значения, которое меньше нуля, отводится две ячейки памяти, или 16 бит информации. При этом 15 уходят под само число, а первый (крайний левый) бит отдается под соответствующий знак.

Если цифра отрицательная, то записывается "1", если положительная, то "0". Для простоты запоминания можно провести такую аналогию: если знак есть, то ставим 1, если его нет, то ничего (0).

Оставшиеся 15 бит информации отводятся под число. Аналогично предыдущему случаю, в них можно поместить максимум пятнадцать единиц. Стоит отметить, что запись отрицательных и положительных чисел существенно отличается друг от друга.

Для того чтобы разместить в 2 ячейках памяти значение больше нуля или равное ему, используется так называемый прямой код. Данная операция производится так же, как и было описано, а максимальное А = 32766, если использовать десятичную систему счисления. Сразу хочется отметить, что в данном случае "0" относится к положительным.

Примеры

Представление целых чисел в памяти компьютера не является такой уж трудной задачей. Хотя она немного усложняется, если речь идет об отрицательном значении. Для записи числа, которое меньше нуля, используется дополнительный код.

Чтобы его получить, машина производит ряд вспомогательных операций.

  1. Сначала записывается модуль отрицательного числа в двоичном счислении. То есть компьютер запоминает аналогичное, но положительное значение.
  2. Затем проводится инвертирование каждого бита памяти. Для этого все единицы заменяются нулями и наоборот.
  3. Прибавляем "1" к полученному результату. Это и будет дополнительный код.

Приведем наглядный пример. Пусть у нас есть число Х = - 131. Сначала получаем его модуль |Х|= 131. Затем переводим в двоичную систему и записываем в 16 ячеек. Получим Х = 0000000010000011. После инвертирования Х=1111111101111100. Добавляем к нему "1" и получаем обратный код Х=1111111101111101. Для записи в 16-битную ячейку памяти минимальным числом является Х = - (215) = - 32767.

Длинные целые

Как видите, представление вещественных чисел в компьютере не так уж и сложно. Однако рассмотренного диапазона может не хватать для большинства операций. Поэтому, для того чтобы разместить большие числа, компьютер выделяет из памяти 4 ячейки, или 32 бита.

Процесс записи абсолютно не отличается от представленного выше. Так что мы просто приведем диапазон чисел, которые могут храниться в данном типе.

Хмах=2 147 483 647.

Хmin=- 2 147 483 648.

Данных значений в большинстве случаев достаточно для того, чтобы записывать и проводить операции с данными.

Представление вещественных чисел в компьютере имеет свои преимущества и недостатки. С одной стороны, данная методика позволяет проще производить операции между целочисленными значениями, что значительно ускоряет работу процессора. С другой стороны, данного диапазона недостаточно для решения большинства задач экономики, физики, арифметики и других наук. Поэтому теперь мы рассмотрим очередную методику для сверхвеличин.

Плавающая запятая

Это последнее, что вам необходимо знать про представление чисел в компьютере. Поскольку при записи дробей возникает проблема определения положения запятой в них, для размещения подобных цифр в компьютере используется экспоненциальная форма.

Любое число может быть представлено в следующей форме Х = m * рп. Где m – это мантисса числа, р – основание системы счисления и п – порядок числа.

Для стандартизации записи чисел с плавающей запятой используется следующее условие, согласно которому модуль мантиссы должен быть больше или равен 1/п и меньше 1.

Пусть нам дано число 666,66. Приведём его к экспоненциальной форме. Получится Х = 0,66666 * 103. Р = 10 и п = 3.

На хранение значений с плавающей запятой обычно выделяется 4 или 8 байт (32 или 64 бита). В первом случае это называется числом обычной точности, а во втором – двойной точности.

Из 4 байт, выделенных под хранение цифр, 1 (8 разрядов) отдается под данные о порядке и его знаке, а 3 байта (24 разряда) уходят на хранение мантиссы и её знака по тем же принципам, что и для целочисленных значений. Зная это, мы можем провести нехитрые расчеты.

Максимальное значение п = 11111112= 12710. Исходя из него, мы можем получить максимальный размер числа, которое может храниться в памяти компьютера. Х=2127. Теперь мы можем вычислить максимально возможную мантиссу. Она будет равна 223 – 1 ≥ 223 = 2(10 × 2,3) ≥ 10002,3 = 10(3 × 2,3) ≥ 107. В итоге, мы получили приближенное значение.

Если теперь мы объединим оба расчета, то получим значение, которое может быть записано без потерь в 4 байта памяти. Оно будет равно Х = 1,701411 * 1038. Остальные цифры были отброшены, поскольку именно такую точность позволяет иметь данный способ записи.

Двойная точность

Поскольку все вычисления были расписаны и объяснены в предыдущем пункте, здесь мы расскажем всё очень коротко. Для чисел с двойной точностью обычно выделяется 11 разрядов для порядка и его знака, а также 53 разряда для мантиссы.

П = 11111111112= 102310.

М = 252 -1 = 2(10*5.2) = 10005.2 = 1015.6. Округляем в большую сторону и получаем максимальное число Х = 21023 с точностью до "м".

Надеемся, информация про представление целых и вещественных чисел в компьютере, которую мы предоставили, пригодится вам в обучении и будет хоть немного понятнее, чем то, что обычно пишут в учебниках.

4. 11. Как представляются в компьютере целые числа?

Целые числа могут представляться в компьютере со знаком или без знака.

Целые числа без знака обычно занимают в памяти один или два байта и принимают в однобайтовом формате значения от 000000002 до 111111112 , а в двубайтовом формате - от 00000000 000000002 до 11111111 111111112.


Диапазоны значений целых чисел без знака

Формат числа в байтах Диапазон
Запись с порядком Обычная запись
1 0 ... 28-1 0 ... 255
2 0 ... 216-1 0 ... 65535

Примеры:

а) число 7210 = 10010002 в однобайтовом формате:

б) это же число в двубайтовом формате:

в) число 65535 в двубайтовом формате:

Целые числа со знаком обычно занимают в памяти компьютера один, два или четыре байта, при этом самый левый (старший) разряд содержит информацию о знаке числа. Знак "плюс" кодируется нулем, а "минус" - единицей.

Диапазоны значений целых чисел со знаком

Формат числа в байтах Диапазон
Запись с порядком Обычная запись
1 -27 ... 27-1 -128 ... 127
2 -215 ... 215-1 -32768 ... 32767
4 -231 ... 231-1 -2147483648 ... 2147483647

Рассмотрим особенности записи целых чисел со знаком на примере однобайтового формата, при котором для знака отводится один разряд, а для цифр абсолютной величины - семь разрядов.

В компьютерной технике применяются три формы записи (кодирования) целых чисел со знаком: прямой код, обратный код, дополнительный код.

Последние две формы применяются особенно широко, так как позволяют упростить конструкцию арифметико-логического устройства компьютера путем замены разнообразных арифметических операций операцией cложения.

Положительные числа в прямом, обратном и дополнительном кодах изображаются одинаково - двоичными кодами с цифрой 0 в знаковом разряде. Например:


Отрицательные числа в прямом, обратном и дополнительном кодах имеют разное изображение.

1. Прямой код. В знаковый разряд помещается цифра 1, а в разряды цифровой части числа - двоичный код его абсолютной величины. Например:


2. Обратный код. Получается инвертированием всех цифр двоичного кода абсолютной величины числа, включая разряд знака: нули заменяются единицами, а единицы - нулями. Например:
3. Дополнительный код. Получается образованием обратного кода с последующим прибавлением единицы к его младшему разряду. Например:
Обычно отрицательные десятичные числа при вводе в машину автоматически преобразуются в обратный или дополнительный двоичный код и в таком виде хранятся, перемещаются и участвуют в операциях. При выводе таких чисел из машины происходит обратное преобразование в отрицательные десятичные числа.

Целые числа без знака и со знаком

Лекция №8

«Международный факультет прикладных информационных технологий

Бакалавриат «Информатика и вычислительная техника»

Представление данных

Определение. Байтом называется последовательность из восьми бит. Байт является минимально адресуемым элементом памяти.

Определение. Словом называется последовательность из двух байтов. Адресом слова является адрес младшего байта и всегда является положительным (ноль рассматриваем как положительное число). Длина слова равна 16 битам.

Определение. Двойным словом называется последовательность из четырёх байтов. Адресом двойного слова является адрес младшего байта и всего является положительным (ноль рассматриваем как положительное число). Длина двойного слова равно 32 битам.

 

Рассмотрим следующие виды чисел, представляемых в памяти машины:

целые числа без знака

целые числа со знаком

числа с фиксированной запятой (точкой)

числа с плавающей запятой (точкой)

 

Целые числа без знака и со знаком

Числа без знака получили свое название потому, что среди этих чисел нет отрицательных. Количество различных чисел, которые можно записать в байте, слове или двойном слове определяется числом сочетаний с повторениями из 2 соответственно по 8, 16, 32. Таким образом, количество различных чисел следующее:

28 = 256 для байта

216 = 65536 для слова

232 = 4294967296 для двойного слова.

 

Целые числа без знака – это самый простой вид чисел: они представляют собой весь диапазон двоичных чисел, которые можно записать в байте, слове или двойном слове.

Диапазоны изменения целых чисел без знака следующие:

00H ( 0) - FF (255) для байта;

0000 ( 0) – FFFF (65535) для слова;

00000000 ( 0) – FFFFFFFF (4294967295) для двойного слова.



 

В представлении целых числа со знаком старший разряд используется как знаковый, а остальные используются для записи числа. Диапазоны изменения целых чисел со знаком следующие:

80H (-128) - 7FH (127)

8000H (-32768) - 7FFF (32767)

 

Определение. Прямым кодом называется двоичная запись неотрицательного целого числа.

Определение. Обратным кодом называется запись, полученная поразрядной инверсией прямого кода.

Определение. Дополнительным кодом называется запись, полученная прибавлением 1 (единицы) к обратному коду.

Отрицательные двоичные числа содержат единичный бит в старшем разряде и выражаются в дополнительном коде. Для представления отрицательного целого двоичного числа необходимо инвертировать все биты, равного по модулю положительного числа, а затем прибавить 1. Иными словами необходимо найти последовательной кодов чисел: прямой код, обратный код, дополнительный.

 

Исходное двоичное число (соответствует десятичному 65)
Инверсные биты:
Плюс 1, т.е. дополнительный код (соответствует десятичному числу (-65)

 

Сумма 65 и (-65) должна составлять ноль. Получим:

 

Все восемь бит имеют нулевое значение. Перенос единичного бита влево потерян.

 

Следует подчеркнуть, что знак числа условен. Одно и то же число, например FBH можно интерпретировать как число со знаком, так и число без знака.

Если битовую комбинацию представленную шестнадцатеричным числом FBH рассматривать как целое со знаком, то её значение будет равно (-5).

 

Если битовую комбинацию представленную шестнадцатеричным числом FBH рассматривать как целое без знака, то её значение будет рано 251.

 

Дадим выборочную таблицу 16-битовых чисел с указанием из машинного представления, а также значений без знака и со знаком. Из этой таблицы видно, что чисел со знаком размером в слово диапазон положительных значений простирается от 0 до 32767, а диапазон отрицательных значений до (-1) до (-32768).

 

16-ричное представление Десятичное представление без знака Десятичное представление со знаком  
0000H Ноль
0001H +1 Минимальное положительное число
0002H +2  
0003H +3  
0004H +4  
 
7FFCH +32764  
7FFDH +32765  
7FFEH +32766  
7FFFH +32767 Максимальное положительное число
8000H -32768 Минимальное отрицательное число
8001H -32767  
8002Н -32766  
8003H -32765  
 
FFFBH -0005  
FFFCH -0004  
FFFDH -0003  
FFFEH -0002  
FFFFH -0001 Минимальное отрицательное число

 

Среди команд процессора, выполняющих обработку чисел, можно выделить команды, безразличные к знаку числа (например, inc, add), команды предназначенные для обработки чисел без знака (ja, jb), а также команды, специально рассчитанные на обработку чисел со знаком (jg, jl).

 

Округление чисел с плавающей запятой (точкой)

Стандарт IEEE 754 описывает операции сложения, умножения, вычитания, деления, вычисления остатка от деления, извлечения квадратного корня и преобразований между различными типами чисел. Общий принцип всех операций заключается в том, что результат получается из точного путем приведения к представимому числу согласно установленному режиму округления.

В стандарте определены четыре режима округления:

округление к ближайшему представимому числу;

округление к –∞;

округление к +∞;

округление к 0.

В режиме округления к ближайшему представимому числу, как следует из названия, результатом операции является представимое число, ближайшее к точному значению. Когда точное значение одинаково удалено от двух представимых чисел, выбирается то, у которого младший бит мантиссы равен нулю.

При округлении к –∞ результатом является ближайшее представимое число, не превосходящее точного значения.

При округлении к +∞ — ближайшее представимое число, которое не меньше точного значения

При округлении к 0 — ближайшее представимое число, не превосходящее по абсолютной величине точного значения.

Определение. Округление к –∞, округление к +∞, округление к 0 называются режимами прямого округления (directed rounding).

Для иллюстрации режимов округления рассмотрим примеры. В первом примере требуется округлить число с заданной мантиссой к ближайшему представимому числу одинарной точности:

исходная мантисса: 101010101010101010101010111111112

округленная мантисса: 101010101010101010101010000000002

В следующем примере требуется округлить число с заданной мантиссой в сторону 0:

исходная мантисса: 101010101010101010101011111111112

округленная мантисса: 101010101010101010101010000000002

 

 

Таблица 3. Примеры округления чисел до десятых
исходное число к ближ. представимому к нулю к +∞ к -∞
1,33 1,3 1,3 1,4 1,3
-1,33 -1,3 -1,3 -1,3 -1,4
1,37 1,4 1,3 1,4 1,3
-1,37 -1,4 -1,3 -1,3 -1,4
1,35 1,4 1,3 1,4 1,3
-1,35 -1,4 -1,3 -1,3 -1,4

Исключения

Стандартом IEEE 754 определены пять типов исключений:

¾ invalid operation — некорректная операция;

¾ division by zero — деление на нуль;

¾ overflow — переполнение;

¾ underflow — потеря значимости;

¾ inexact — потеря точности.

В стандарте приводится список ситуаций, в которых выставляется исключение invalid operation. Ниже представлены некоторые из них:

¾ любые операции над SNaN;

¾ сложение бесконечностей с разными знаками или вычитание бесконечностей с одинаковыми знаками;

¾ умножение 0 · ∞;

¾ деление 0/0 или ∞/∞;

¾ взятие остатка от деления x rem y, где y = 0 или x = ∞;

¾ извлечение квадратного корня из отрицательного числа.

Рассмотрим остальные исключения на примере деления чисел двойной точности в режиме округления к 0.

Исключение division by zero выставляется, когда делитель равен нулю.

Обязательное условие возникновения исключения — не равное нулю или бесконечности делимое. В случае возникновения исключения division by zero

результат равен бесконечности:

делимое: 7FEFFFFFFFFFFFFF16 (1.797693e+308)

делитель: 000000000000000016 (+0)

частное: 7FF000000000000016 (+∞)

исключения: division by zero

 

Исключение overflow возникает, когда результат операции превышает (по абсолютной величине) наибольшее представимое число:

 

делимое: 7FEFFFFFFFFFFFFF16 (1.797693e+308)

делитель: 0003A6B50B0F27BB16 (5.077619e–309)

частное: 7FEFFFFFFFFFFFFF16 (1.797693e+308)

исключения: overflow и inexact

 

Исключение underflow возникает, когда результат операции настолько мал (по абсолютной величине), что он может быть представлен только денормализованным числом:

 

делимое: 001000000000000016 (2.225074e–308)

делитель: 7FEFFFFFFFFFFFFF16 (1.797693e+308)

частное: 000000000000000016 (+0)

исключения: underflow и inexact

 

Исключение inexact возникает, когда результат операции отличается от точного

значения:

делимое: 27E83F0F3FFC953816 (1.786431e+000)

делитель: FBAF43813FFFFFFF16 (2.000000e+000)

частное: 2BC3037F3FEC953816 (8.932153e–001)

исключения: inexact

 

Алгоритм Малкома

В начале семидесятых годов 20-го века Malcolm и Gentleman предложили алгоритм для вывода некоторых характеристик систем с плавающей точкой.

A := 1.0;

B := 1.0;

while ((A+1.0)-A)-1.0 = 0.0

A := 2 * A;

while ((A+B)-A)-B <> 0.0

B := B + 1.0;

return(B)

Двоичные файлы

Двоичные файлы состоят из последовательности чисел, представляющих собой закодированную информацию, которая может загружаться непосредственно в компьютер. Микропроцессор компьютера обладает всеми необходимыми средствами для того, чтобы разобраться в этой последовательности и определить команды от данных. Большинство программ хранится в двоичных файлах.

Двоичные программные файлы являются микропроцессорно-ориентированными. Это означает, что программа, написанная для компьютера IBM PC, может быть выполнена только на компьютере, имеющей ту же самую систему команд.

Если в двоичном файле находятся и данные, то прочитать и понять их можно только с помощью специально написанной программы.

Текстовые файлы.

Если каждому символу алфавита сопоставить определенное число (например, порядковый номер), то с помощью двоичного кода можно кодировать и текстовую информацию. Восьми двоичных разрядов достаточно для кодирования 256 различных символов. Этого хватит, чтобы выразить различными комбинациями восьми битов все символы английского и русского алфавитов, как строчные, так и прописные, а также знаки препинания, символы основных арифметических действий и некоторые общепринятые специальные символы, например "@".

Теоретически это выглядит очень просто, однако всегда существовали достаточно веские органзационные сложности. В первые годы развития вычислительной техники они были связаны с отсутствием необходимых стандартов, а в настоящее время вызваны, наоборот, изобилием одновременно действующих и противоречивых стандртов. Для того, чтобы весь мир одинаково кодировал текстовые данные, нужны единые таблицы кодирования, а это пока невозможно из-за противоречий между символами национальных алфавитов, а также противоречий корпоративного характера.

Для английского языка, ставшего международным средством общения, противоречия уже сняты. Институт стандартизации США (ANSI – American Standard Institute) ввел в действие систему кодирования ASCII (American Standard Code for Information Interchange – стандартный код информационного обмена США). В системе ASCII закреплены две таблицы кодирования – базовая и расширенная. Базовая таблица закрепляет значения кодов от 0 до 127, а расширенная относится к символам от 128 до 255.

ASCII-код

С целью стандартизации в компьютерах используется американский национальный стандартный код для обмена информацией ASCII (American National Standard Code for Information). Наличие стандартного кода облегчает обмен данными между различными устройствами. Восьмибитовый расширенный ASCII-код обеспечивает представление 256 символов, включая символы для национальных алфавитов.

Но 01000001 представляет также букву А. Таким образом одна и та же комбинация из восьми битов может представлять как число, так и букву, а данном случае комбинаций 01000001 это 65, а с другой стороны – буква А. Все зависит от интерпретации битового содержания.

Если программа определяет элемент данных для арифметических целей, то 01000001 представляет двоичное число, эквивалентное десятичному числу 65.

Если программа определяет элемент данных (один смежный байт или более), имея в виду его описание, как, например, заголовок, тогда 01000001 представляет собой букву или «строку».

При программировании это различие становится понятным, так как назначение каждого элемента данных определено.

Закономерно возникает вопрос, откуда компьютер «знает», что значения восьми бит 01000001 представляют букву А. Когда на клавиатуре нажата клавиша А, операционная система принимает сигнал от этой конкретной клавиши в байт памяти. Это сигнал устанавливает биты в значения 01000001. Можно переслать этот байт в память, и если передать его на экран или принтер, то будет сгенерирована буква А.

Первые 32 кода базовой таблицы, начиная с нулевого, отданы производителям аппаратных средств. В этой области располагаются так называемые управляющие коды, которым не соответствуют никакие символы языков, и, соответственно, эти коды не выводятся на экран, ни на устройства печати, но ими можно управлять тем, как производится выод прочих данных. Начиная с кода 32 по код 127 размещены коды символов английского алфавита, знаков препинания, цифр, арифметических действий и некоторых вспомогательных символов.

Список литературы

  1. IEEE 754-2008 Standard for Floating-Point Arithmetic
    Институт инженеров по электротехнике и радиоэлектронике
    Официальный стандарт по арифметике с числами с плавающей точкой http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933
  2. ISO/IEC JTC1/SC22/WG14 – Programming Language C
    Стандарт языка программирования высокого уровня C, включающий в себя описание реализации чисел с плавающей точкой в этом языке. http://www.open-std.org/jtc1/sc22/wg14/
  3. ISO/IEC JTC1/SC22/WG21 – Programming Language C++
    Стандарт языка программирования высокого уровня C++, включающий в себя описание реализации чисел с плавающей точкой в этом языке. http://www.open-std.org/JTC1/SC22/WG21/
  4. А.C. Камкин, М.M. Чупилко. Тестирование модулей арифметики с плавающей точкой микропроцессоров на соответствие стандарту IEEE 754. Стр. 7-22. Труды Института системного программирования РАН, том 14, 2008 г. Часть 2. ISSN 2220-6426 (Online), ISSN 2079-8156 (Print). Стр. 7-22. http://www.ispras.ru/ru/proceedings/archives/isp_2008_14_2/isp_2008_14_2_7.php

 

Лекция №8

«Международный факультет прикладных информационных технологий

Бакалавриат «Информатика и вычислительная техника»

Представление данных

Определение. Байтом называется последовательность из восьми бит. Байт является минимально адресуемым элементом памяти.

Определение. Словом называется последовательность из двух байтов. Адресом слова является адрес младшего байта и всегда является положительным (ноль рассматриваем как положительное число). Длина слова равна 16 битам.

Определение. Двойным словом называется последовательность из четырёх байтов. Адресом двойного слова является адрес младшего байта и всего является положительным (ноль рассматриваем как положительное число). Длина двойного слова равно 32 битам.

 

Рассмотрим следующие виды чисел, представляемых в памяти машины:

целые числа без знака

целые числа со знаком

числа с фиксированной запятой (точкой)

числа с плавающей запятой (точкой)

 

Целые числа без знака и со знаком

Числа без знака получили свое название потому, что среди этих чисел нет отрицательных. Количество различных чисел, которые можно записать в байте, слове или двойном слове определяется числом сочетаний с повторениями из 2 соответственно по 8, 16, 32. Таким образом, количество различных чисел следующее:

28 = 256 для байта

216 = 65536 для слова

232 = 4294967296 для двойного слова.

 

Целые числа без знака – это самый простой вид чисел: они представляют собой весь диапазон двоичных чисел, которые можно записать в байте, слове или двойном слове.

Диапазоны изменения целых чисел без знака следующие:

00H ( 0) - FF (255) для байта;

0000 ( 0) – FFFF (65535) для слова;

00000000 ( 0) – FFFFFFFF (4294967295) для двойного слова.

 

В представлении целых числа со знаком старший разряд используется как знаковый, а остальные используются для записи числа. Диапазоны изменения целых чисел со знаком следующие:

80H (-128) - 7FH (127)

8000H (-32768) - 7FFF (32767)

 

Определение. Прямым кодом называется двоичная запись неотрицательного целого числа.

Определение. Обратным кодом называется запись, полученная поразрядной инверсией прямого кода.

Определение. Дополнительным кодом называется запись, полученная прибавлением 1 (единицы) к обратному коду.

Отрицательные двоичные числа содержат единичный бит в старшем разряде и выражаются в дополнительном коде. Для представления отрицательного целого двоичного числа необходимо инвертировать все биты, равного по модулю положительного числа, а затем прибавить 1. Иными словами необходимо найти последовательной кодов чисел: прямой код, обратный код, дополнительный.

 

Исходное двоичное число (соответствует десятичному 65)
Инверсные биты:
Плюс 1, т.е. дополнительный код (соответствует десятичному числу (-65)

 

Сумма 65 и (-65) должна составлять ноль. Получим:

 

Все восемь бит имеют нулевое значение. Перенос единичного бита влево потерян.

 

Следует подчеркнуть, что знак числа условен. Одно и то же число, например FBH можно интерпретировать как число со знаком, так и число без знака.

Если битовую комбинацию представленную шестнадцатеричным числом FBH рассматривать как целое со знаком, то её значение будет равно (-5).

 

Если битовую комбинацию представленную шестнадцатеричным числом FBH рассматривать как целое без знака, то её значение будет рано 251.

 

Дадим выборочную таблицу 16-битовых чисел с указанием из машинного представления, а также значений без знака и со знаком. Из этой таблицы видно, что чисел со знаком размером в слово диапазон положительных значений простирается от 0 до 32767, а диапазон отрицательных значений до (-1) до (-32768).

 

16-ричное представление Десятичное представление без знака Десятичное представление со знаком  
0000H Ноль
0001H +1 Минимальное положительное число
0002H +2  
0003H +3  
0004H +4  
 
7FFCH +32764  
7FFDH +32765  
7FFEH +32766  
7FFFH +32767 Максимальное положительное число
8000H -32768 Минимальное отрицательное число
8001H -32767  
8002Н -32766  
8003H -32765  
 
FFFBH -0005  
FFFCH -0004  
FFFDH -0003  
FFFEH -0002  
FFFFH -0001 Минимальное отрицательное число

 

Среди команд процессора, выполняющих обработку чисел, можно выделить команды, безразличные к знаку числа (например, inc, add), команды предназначенные для обработки чисел без знака (ja, jb), а также команды, специально рассчитанные на обработку чисел со знаком (jg, jl).

 


Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:

Представление значений в памяти - Реальный мир OCaml

Работающая программа OCaml использует блоки памяти (т. Е. Непрерывные последовательности слов в ОЗУ) для представления таких значений, как кортежи, записи, замыкания или массивы. Программа OCaml неявно выделяет блок памяти при создании такого значения:

Объявление типа t не занимает никакой памяти во время выполнения, но последующая привязка let выделяет новый блок памяти с двумя словами доступного пространства.Одно слово содержит поле foo , а другое слово содержит поле bar . Компилятор OCaml переводит такое выражение в явное выделение блока из системы времени выполнения OCaml.

OCaml использует унифицированное представление памяти, в котором каждая переменная OCaml хранится как значение . Значение OCaml - это отдельное слово памяти, которое является либо непосредственным целым числом, либо указателем на другую память. Среда выполнения OCaml отслеживает все значения, чтобы освободить их, когда они больше не нужны.Таким образом, он должен иметь возможность различать целые числа и значения указателя, поскольку он сканирует указатели для поиска дополнительных значений, но не отслеживает целые числа, которые не указывают на что-либо значимое, кроме их непосредственного значения.

Различение целых чисел и указателей во время выполнения

Обертывание типов примитивов (таких как целые числа) внутри другой структуры данных, которая записывает дополнительные метаданные о значении, известно как упаковка . Значения помещены в рамки, чтобы сборщику мусора (GC) было проще выполнять свою работу, но за счет дополнительного уровня косвенного доступа к данным в пределах значения в рамке.

значений OCaml не обязательно упаковывать во время выполнения. Вместо этого значения используют один бит тега на слово, чтобы различать целые числа и указатели во время выполнения. Значение является целым числом, если младший бит блочного слова отличен от нуля, и указателем, если младший бит блочного слова равен нулю. Несколько типов OCaml отображаются на это целочисленное представление, включая bool , int , пустой список и unit . Некоторые типы, например варианты, иногда используют это целочисленное представление, а иногда нет.В частности, для вариантов конструкторы констант, то есть конструкторы без аргументов, такие как Нет , представлены как целые числа, но конструкторы, такие как Некоторые , которые несут связанные значения, помещены в рамки.

Это представление означает, что целые числа являются неупакованными значениями времени выполнения в OCaml, так что их можно сохранять напрямую, не выделяя блок-оболочку. Их можно передавать непосредственно в вызовы других функций в регистрах и, как правило, они являются самыми дешевыми и быстрыми значениями для использования в OCaml.

Значение рассматривается как указатель памяти, если его младший бит равен нулю. Несмотря на это, значение указателя можно сохранить без изменений, поскольку указатели гарантированно выровнены по словам (нижние биты всегда равны нулю).

Единственная проблема, которая остается с этим представлением в памяти, - это различать указатели на значения OCaml (за которыми должен следовать сборщик мусора) и указатели в системной куче на значения C (которые не должны соблюдаться).

Механизм для этого прост, поскольку система времени выполнения отслеживает блоки кучи, которые она выделила для значений OCaml.Если указатель находится внутри фрагмента кучи, который помечен как управляемый средой выполнения OCaml, предполагается, что он указывает на значение OCaml. Если он указывает за пределы области выполнения OCaml, он рассматривается как непрозрачный указатель C на какой-либо другой системный ресурс.

Немного истории об указателях OCaml с выравниванием по словам

Читателю предупреждений может быть интересно, как OCaml может гарантировать, что все его указатели выровнены по словам. В старые времена, когда чипы RISC, такие как Sparc, MIPS и Alpha, были обычным явлением, невыровненный доступ к памяти был запрещен архитектурой набора команд и приводил к исключению ЦП, которое завершало программу.Таким образом, все указатели исторически округлялись до размера архитектурного слова (обычно 32 или 64 бита).

Современные процессоры CISC, такие как Intel x86, действительно поддерживают невыровненный доступ к памяти, но чип по-прежнему работает быстрее, если доступы выровнены по словам. Поэтому OCaml просто требует, чтобы все указатели были выровнены по словам, что гарантирует, что несколько нижних битов любого действительного указателя будут нулевыми. Установка нижнего бита на ненулевое значение - это простой способ пометить целое число за счет потери этого единственного бита точности.

Еще более внимательный читатель будет интересоваться последствиями для производительности целочисленной арифметики, использующей это представление с тегами. Поскольку нижний бит установлен, любая операция с целым числом должна сдвинуть нижний бит вправо, чтобы восстановить «собственное» значение. Компилятор OCaml в собственном коде в этом случае генерирует эффективный ассемблерный код x86, используя преимущества современных инструкций процессора, чтобы скрыть дополнительные сдвиги там, где это возможно. Сложение - это одна инструкция LEA x86, вычитание может состоять из двух инструкций, а умножение - это всего лишь несколько дополнительных.

Целочисленная безопасность

Раскрытие информации рекламодателя
  • Visual C ++ / C ++ »
    • Пример главы
    • Безопасность
    • C ++ »
      • Алгоритмы и формулы »
        • Общие
        • Алгоритмы контрольной суммы
        • Комбинации
        • Сжатие / декомпрессия
        • Факториалы
        • Хеш-таблицы
        • Связанные списки
        • Математика
        • Ищем
        • Сортировка
        • Строковые алгоритмы
        • Проблемы переносимости
      • C ++ и MFC »
        • Общие
        • Обработка массивов
        • Двоичные деревья
        • Биты и байты
        • Манипуляции с буфером и памятью
        • Обратный звонок
        • Классы и использование классов
        • Коллекции
        • Сжатие
        • Перетаскивание
        • События
        • Исключения
        • Внешние ссылки
        • Файловый ввод-вывод
        • Вызов функции
        • Связанные списки
        • Отслеживание памяти
        • Объектно-ориентированное программирование (ООП)
        • Открыть FAQ
        • Разбор
        • Узоры
        • Указатели
        • Мобильность
        • RTTI
        • Сериализация
        • Синглтоны
        • Стандартная библиотека шаблонов (STL)
        • шаблоны
        • Учебники
      • Дата и время »
        • Общие
        • Контроль даты
        • Временные программы
      • C ++ / CLI »
        • .NET Framework классы
        • Общие
        • ASP / ASP.NET
        • Упаковка и распаковка
        • Компоненты
        • Сборка мусора и финализаторы
        • взаимодействие
        • Переход из неуправляемого
        • Процессы и потоки
        • шаблоны
        • Visual Studio.НЕТТО 2003
      • Строковое программирование »
        • Общие
        • Альтернативы CString
        • Расширения CString
        • Манипуляции с CString
        • Открыть FAQ
        • Регулярные выражения
        • Строковые массивы
        • Преобразование строк
        • .NET
    • COM-технологии »
      • Программирование ATL и WTL »
        • Общие
        • ATL
        • Активные сценарии
        • Элементы управления ActiveX
        • База данных
        • Отладка
        • Внешние ссылки
        • Поддержка графики
        • Разное.
        • Производительность
        • Печать
        • Учебники
        • Утилиты
        • Библиотека шаблонов Windows (WTL)
      • Программирование ActiveX »
        • Общие
        • Активные сценарии
        • Элементы управления ActiveX
        • Документы ActiveX
        • Квартиры и поток
        • Обработка ошибок
        • Внешние ссылки
        • Общие COM / DCOM
        • Разное.
        • Реестр
        • Безопасность
        • Структурированное хранилище
        • Учебники
        • Упаковщики
      • COM + »
        • Общие
        • COM-взаимодействие
        • Управляемый код /.NET
        • SOAP и веб-службы
      • Программирование оболочки »
        • Общие
        • Открыть FAQ
        • Ярлыки
        • Иконки в трее
        • Начальник предыдущей секции
    • Элементы управления »
      • Лист свойств »
        • Открыть FAQ
        • Кнопки окна свойств
        • Калибр
        • Мастера
      • Кнопочное управление »
        • Расширенные кнопки
        • Растровые кнопки
        • Плоские кнопки
        • Меню
        • Непрямоугольные кнопки
        • Windows XP
      • Поле со списком "
        • Палитра цветов
        • Выпадающее
        • Комбинации шрифтов
        • Многоколоночные комбинации
        • Специальные эффекты
        • Всплывающие подсказки
      • Изменить элемент управления »
        • Фон и цвет
        • Редакторы
        • Клавиатура
        • Элементы управления маскированным редактированием
        • Пароли и безопасность
        • Органы управления отжимом
        • прозрачный
      • ImageList Control »
        • Открыть FAQ
      • Элемент управления ListBox »
        • Флажки
        • Цветные списки
        • Перетаскивание
        • Светодиоды
      • Элемент управления ListView »
        • Продвинутый
        • Цвет фона и изображение
        • Флажки
        • Колонны
        • Пользовательский чертеж
        • Данные
        • Удаление
        • Перетаскивание
        • Редактирование позиций и подпунктов
        • FilterBar
        • Линии сетки
        • Элемент управления заголовком
        • Введение
        • Разное
        • Навигация
        • Новый элемент управления ListView (IE 4.0)
        • Печать
        • Списки Недвижимости
        • Отчеты
        • Полосы прокрутки
        • Выбор
        • Сортировка
        • Подсказка и подсказка к заголовку
        • Использование изображений
        • Просмотры
      • Меню »
        • Альтернативное меню
        • Растровые меню
        • Закрепляемые меню
        • Маршрутизация сообщений и команд
        • Разное
        • XML
        • Меню в стиле XP
      • Другие элементы управления »
        • Растровые кнопки
        • Диаграммы и аналоговые элементы управления
        • Элементы управления флажком
        • Часы и таймеры
        • Cool Controls
        • Элементы управления выбором даты и т. Д.
        • Цифровое управление
        • Методы расширения / создания подклассов
        • Выбор файлов и каталогов
        • Управление сетью
        • Групповой ящик
        • HyperLink контролирует
        • Интернет и Интернет
        • Списки, деревья и комбинации
        • Кнопка свертывания
        • Контроль выполнения
        • Изменение размера
        • Полосы прокрутки
        • Ползунок управления
        • Контроль отжима
        • Системный лоток
        • Элементы управления вкладками
        • Элементы управления всплывающей подсказкой
        • Диаграммы и аналоговые элементы управления
        • Методы расширения / создания подклассов
      • Богатый контроль редактирования »
        • Преобразования
        • Редакторы и монтажники
        • Синтаксис Hilighting
        • Без окон
      • Статический контроль »
        • Линии фаски
        • Элементы управления отображением данных
        • Прокрутка текста
      • Статус бар "
        • Продвинутый
        • Системный лоток
      • Панель инструментов »
        • Настройка панелей инструментов
        • Док-станция
        • Плоская панель инструментов
        • Разное
        • Размещение элементов управления на панелях инструментов
        • Размещение элементов управления на панелях инструментов
      • Элемент управления в виде дерева »
        • Классы
        • Каталог браузеров
        • Перетаскивание
        • Редактирование этикеток
        • Развернуть - Свернуть
        • Разное - Расширенный
        • Мультиэкран
        • Новый элемент управления Listview (IE 4.0)
        • Ищем
        • Обход дерева
        • Использование изображений
    • Данные "
      • База данных "
        • ADO
        • ADO.NET
        • ATL
        • DAO
        • Динамический доступ к данным
        • Microsoft Access
        • Microsoft Excel
        • Разное.
        • Объектно-ориентированный
        • ODBC
        • OLE DB
        • Оракул
        • SQL Server
        • Хранимые процедуры
        • XML
      • Разное "
        • Информация о файле
        • Файлы INI
        • Значения
        • XML
    • Фреймворки »
      • Пользовательский интерфейс и основы печати »
        • Библиотеки компонентов
        • Элементы управления Outlook
        • Отчетность и написание отчетов
        • Скины
        • Отчетность и написание отчетов
        • Методы и классы окон
    • Графика и мультимедиа »
      • Растровые изображения и палитры »
        • Захват
        • Сжатие
        • Отображение и размер
        • Внешние ссылки
        • Иконки
        • Обработка изображений
        • Слияние
        • Другие форматы...
        • Палитры и таблицы цветов
        • Специальные эффекты
        • Использование регионов
        • Зрителей
        • Просмотры и клиенты MDI
      • DirectX »
        • DirectDraw
        • DirectInput
        • DirectShow
        • DirectX 8
      • GDI »
        • Захват изображений
        • Заполнение
        • Обработка и обнаружение шрифтов
        • GDI +
        • Иконки и курсоры
        • строк
      • Мультимедиа »
        • Аудио
        • Настольные эффекты
        • Графика
        • Изображения
        • Таймеры
        • Твен
        • Видео
      • OpenGL »
        • Программирование игр
        • Печать
        • Наложение текстур
    • Интернет и сети »
      • Интернет-протоколы »
        • ActiveX
        • Управление браузером
        • Чат-программы
        • DHTML
        • Набор номера
        • DNS
        • Электронная почта
        • Передача файлов
        • FTP
        • Общий Интернет
        • HTML
        • HTTP
        • Обмен мгновенными сообщениями
        • Интернет-протокол (IP)
        • Сеть
        • Уровень защищенных сокетов (SSL)
        • Безопасность
        • Потоковое мультимедиа
        • Веб-службы
        • XML
      • Программирование IE »
        • Отображение информации
        • Безопасность
        • Голос
      • ISAPI »
        • Файлы cookie
        • Данные / Базы данных
        • Расширения
        • Фильтры
        • Связанные разделы CODEGURU
      • Сетевые протоколы »
        • Active Directory
        • Базовые сетевые операции
        • Удаленный доступ к сети
        • Игры
        • IPX
        • Сообщения
        • Именованные трубы
        • Сетевая информация
        • Удаленное администрирование
        • Удаленный вызов
        • Последовательная связь
        • TCP / IP
        • Решения Winsock
    • Разное "
      • Разное "
        • Контроль приложений
        • Язык ассемблера
        • CD-ROM
        • Компилятор и предварительный компилятор
        • Консольные приложения
        • CryptoAPI
        • Перетаскивание
        • Именование файлов и каталогов
        • Файловый ввод-вывод
        • Рисунок без мерцания
        • Шрифтов
        • Графика
        • ImageList
        • Intellisense
        • Интерфейс с другими языками
        • Internet Explorer
        • Методы IPC
        • Клавиатура
        • Файлы журнала и трассировки
        • MAPI
        • Математика
        • Память
        • Обработка окна сообщений
        • Справка MFC
        • Microsoft Office / Outlook
        • Оболочка Microsoft (MSH)
        • Работа с мышью и курсором
        • MSN
        • Многоязычная поддержка
        • Плагины / Надстройки
        • API управления питанием
        • Хранители экрана
        • Заставки-заставки
        • Стек
        • Система
        • Системный лоток
        • Планировщик заданий
        • Шаблонные классы
        • Потоки / процессы
        • Таймеры
        • Заголовок
        • Инструменты
        • UML
        • Информация о версии
        • Видео
        • Visual InterDev
        • Обмен сообщениями Windows
      • Образцы »
        • Базовое программирование
        • Выделение кода
        • Игры
        • Информация о системе
        • Тестирование и отладка
    • Visual Studio »
      • Отладка »
        • Отладчики
        • Обработка сбоев
        • Лесозаготовки
        • Проблемы с памятью
        • Обратное проектирование
        • Розыск
      • Надстройки и макросы »
        • Надстройки
        • Закладки
        • Браузер Windows
        • Генерация кода
        • Код навигации
        • Переформатирование кода
        • Надстройка шаблона кода
        • Создатели комментариев
        • Пользовательские мастера приложений
        • Отладка
        • Создание файла
        • Открытие файла
        • Текстовые операции
        • Контроль версий
        • Visual Studio.NET
        • Управление окнами
      • Советы редактора »
        • Настройка IDE
        • Отладка
        • Подсветка синтаксиса
    • Программирование для Windows »
      • Vista
      • CE »
        • Растровые изображения и GDI
        • COM
        • Органы управления
        • База данных
        • Встроенный Visual C ++
        • Файлы
        • Программирование игр
        • Управление памятью
        • Сеть
        • Карманный компьютер
        • Реестр
        • Образцы
        • Оболочка и связанное с ней программирование
        • Смартфон
      • Буфер обмена »
        • Внешние ссылки
        • Начальник предыдущей секции
      • DLL »
        • Зацеп
        • Проблемы импорта / экспорта
        • Взаимодействие с приложениями Visual Basic
        • Смешанные библиотеки DLL
        • подсказки
        • Взаимодействие с приложениями Visual Basic
      • Папка "
        • Функции и диалоги браузера
        • Элементы управления и диалоги
        • Информация о файле
        • Файловый ввод-вывод
        • Обслуживание папок / каталогов
        • INI файлы
        • Установщики
        • Функции API оболочки
      • Справочные системы »
        • HTML
        • MSDN
      • Печать »
        • Открыть FAQ
        • Предварительный просмотр
      • Win32 »
        • Курсоры
        • Окно сообщений
        • Безопасность
        • Учебники
        • Версии
      • Система »
        • CD-ROM
        • Панель управления
        • Разработка драйверов устройств
        • Информация об оборудовании
        • Клавиатура
        • Лесозаготовки
        • Обработка сообщений
        • Разное
        • Снимки MMC
        • Услуги NT
        • Статистика производительности

Представление данных в компьютерных системах

  • Ресурс исследования
  • Исследовать
    • Искусство и гуманитарные науки
    • Бизнес
    • Инженерная технология
    • Иностранный язык
    • История
    • Математика
    • Наука
    • Социальная наука
    Лучшие подкатегории
    • Продвинутая математика
    • Алгебра
    • Основы математики
    • Исчисление
    • Геометрия
    • Линейная алгебра
    • Предалгебра
    • Предварительный расчет
    • Статистика и вероятность
    • Тригонометрия
    • другое →
    Лучшие подкатегории
    • Астрономия
    • Астрофизика
    • Биология
    • Химия
    • Науки о Земле
    • Наука об окружающей среде
    • Здравоохранение
    • Физика
    • другое →
    Лучшие подкатегории
    • Антропология
    • Закон
    • Политология
    • Психология
    • Социология
    • другое →
    Лучшие подкатегории
    • Бухгалтерский учет
    • Экономика
    • Финансы
    • Менеджмент
    • другое →
    Лучшие подкатегории
    • Аэрокосмическая техника
    • Биоинженерия
    • Химическая промышленность
    • Гражданское строительство
    • Компьютерные науки
    • Электротехника
    • Промышленное проектирование
    • Машиностроение
    • Веб-дизайн
    • другое →

Представления чисел с фиксированной и плавающей запятой

В моем предыдущем посте мы изучили фундаментальные концепции использования двоичного кода для представления действительных чисел (т.е.е. числа с дробной составляющей). Когда дело доходит до хранения этих чисел, в современных вычислениях есть два основных подхода. Это нотация с фиксированной точкой и нотация с плавающей точкой .

В сегодняшней публикации мы продолжаем наращивать наши базовые знания в области информатики и подробно изучаем эти форматы хранения. Эти знания будут полезны в следующих публикациях, когда мы углубимся в Типы данных , фундаментальные строительные блоки приложения iOS.

Как мы узнали в моем последнем посте, дробные двоичные числа состоят из двух частей: битов, представляющих целое число (часть перед точкой счисления) и битов, представляющих дробную часть (часть после точки счисления).

Подумайте об этом! Что, если бы у нас было только ограниченное количество двоичных битов для хранения дробного двоичного числа? Это распространено во многих современных компьютерных системах. Как мы узнаем, сколько бит использовать для целой части и сколько бит использовать для дробной части?

Это проблема, которую пытаются решить представления как с фиксированной, так и с плавающей точкой.

Для начала давайте взглянем на обозначение с фиксированной точкой. Это более простое из двух представлений.

Представление фиксированной точки

Обозначение с фиксированной точкой - это представление дробного числа, хранящегося в памяти. В нотации с фиксированной точкой число сохраняется как целое число со знаком в формате дополнения до двух.

Вдобавок к этому мы применяем условное разбиение, помещая точку счисления (разделитель между целой и дробной частями) на фиксированное количество битов слева от его начальной позиции записи справа от наименее значимого бита.Я проиллюстрировал это на диаграмме ниже.

Когда мы интерпретируем биты целого числа со знаком, хранящиеся в памяти, мы перемещаем точку счисления, умножая сохраненное целое число на фиксированный коэффициент масштабирования. Коэффициент масштабирования в двоичном формате всегда равен 2 с фиксированным показателем степени. Поскольку коэффициент масштабирования равен степени 2, он перемещает точку счисления на некоторое количество мест влево или вправо от ее начальной позиции.

Во время этого преобразования существует три направления, в которых можно перемещать точку счисления:

  • Точка системы счисления перемещается вправо: Это представлено коэффициентом масштабирования, показатель степени которого равен 1 или больше.В этом случае дополнительные нули добавляются справа от наименее значимого бита и означают, что фактически представляемое число больше, чем сохраненное двоичное целое число.

  • Точка системы счисления остается на прежнем месте: Она представлена ​​коэффициентом масштабирования, экспонента которого равна 0, и означает, что сохраненное целочисленное значение точно такое же, как и представляемое целочисленное значение.

  • Точка системы счисления перемещается влево: Это представлено коэффициентом масштабирования, показатель степени которого отрицателен.Это означает, что представляемое число меньше целого числа, которое было сохранено, и означает, что представляемое число имеет дробную составляющую.

Давайте взглянем на пару примеров.

Примеры чисел с фиксированной точкой

Предположим, у нас есть 8-битное двоичное число со знаком 00011011 2 , которое хранится в памяти с использованием 8-битного хранилища (отсюда и ведущие нули).

В нашем первом сценарии предположим, что это число было сохранено как представление с фиксированной точкой со знаком с масштабным коэффициентом 2 2 .

Поскольку наш масштабный коэффициент больше 1, когда мы переводим биты, хранящиеся в памяти, в число, которое мы фактически представляем, мы перемещаем точку счисления на два места вправо. Это дает нам число: 1101100 2 (обратите внимание на дополнительные нули, добавленные справа от младшего разряда).

В нашем втором сценарии предположим, что мы начинаем с того же двоичного числа в памяти, но на этот раз мы предположим, что оно хранится как представление с фиксированной точкой со знаком и масштабным коэффициентом 2 -3 .Поскольку показатель степени отрицательный, мы перемещаем точку счисления на три позиции влево. Это дает нам номер 00011.011 2

Преимущества и недостатки представления фиксированной точки

Основным преимуществом использования представления с фиксированной точкой является производительность. Поскольку значение, хранящееся в памяти, является целым числом, ЦП может воспользоваться преимуществами многих оптимизаций, которые современные компьютеры имеют для выполнения целочисленной арифметики, без необходимости полагаться на дополнительное оборудование или программную логику.Это, в свою очередь, может привести к увеличению производительности и, следовательно, при написании ваших приложений может улучшить работу ваших пользователей.

Однако есть и обратная сторона! Представления с фиксированной точкой имеют относительно ограниченный диапазон значений, которые они могут представлять.

Итак, как нам определить максимальные и минимальные числа, которые могут быть сохранены в представлении с фиксированной точкой, и определить, подходит ли оно для наших нужд? Все, что мы делаем, это берем наибольшее и наименьшее целочисленные значения, которые могут быть сохранены в данном количестве битов, и умножаем их на коэффициент масштабирования, связанный с нашим представлением с фиксированной точкой.Для заданного двоичного числа со знаком, использующего b бит памяти с масштабным коэффициентом f , максимальное и минимальное значения, которые могут быть сохранены, составляют:

Минимум: −2 b −1 /2 f

Максимум: (2 b −1 −1) / 2 f

Если число, которое вы хотите представить, попадает в этот диапазон, тогда все в порядке. Но если этого не происходит, вам нужно искать альтернативу! Здесь на помощь приходит нотация с плавающей точкой.

Обозначение с плавающей точкой

Нотация с плавающей точкой является альтернативой нотации с фиксированной точкой и представляет собой представление, которое большинство современных компьютеров используют при хранении дробных чисел в памяти. Нотация с плавающей запятой - это способ точного представления очень больших или очень маленьких чисел с использованием научной записи в двоичном формате. При этом представление с плавающей точкой обеспечивает различную степень точности в зависимости от масштаба используемых вами чисел.

Например, уровень точности, который нам нужен, когда мы говорим о расстоянии между атомами (10 -10 м), очень отличается от точности, которая нам нужна, когда мы говорим о расстоянии между Землей и Солнцем ( 10 11 м). Это главное преимущество, которое позволяет представлять гораздо более широкий диапазон чисел, чем это возможно в нотации с фиксированной точкой.

Представление

с плавающей запятой основано на Scientific Notation . Возможно, вы использовали научную нотацию в школе.

Когда мы используем десятичную дробь (форма, с которой вы, вероятно, наиболее знакомы), мы записываем числа в следующей форме:

+/- мантисса x 10 показатель степени

В этой форме есть необязательный знак, указывающий, является ли общее число положительным или отрицательным, за которым следует мантисса (также известная как мантисса), которая является действительным (дробным) числом, которое, в свою очередь, умножается на основание числа (или radix), возведенный в степень. Как мы знаем, в десятичной системе счисления это основание 10.

Представление с плавающей запятой - это, по сути, научная нотация, применяемая к двоичным числам. В двоичном формате единственное реальное отличие состоит в том, что основание числа - 2 вместо 10. Поэтому мы бы записали числа с плавающей запятой в следующей форме:

+/- мантисса x 2 показатель степени

Возможно, вы этого не осознавали, но когда мы записываем числа в экспоненциальном представлении (будь то двоичное или десятичное), мы можем записывать их разными способами.

В десятичной системе можно записать 1.5 x 10 2 , 15 x 10 1 и 150 x 10 0 , но все эти числа имеют точно такое же значение.

Это обеспечивает гибкость, но с такой гибкостью также возникает путаница. Чтобы попытаться устранить эту путаницу, используется общий набор правил, известный как нормализованная научная запись, чтобы определить, как обычно записываются числа в научной записи.

Нормализованная научная запись

Нормализованная научная нотация - это номенклатура, которая стандартизирует способ записи чисел в экспоненциальной записи.В нормализованном виде у нас есть одно ключевое правило:

«Мы выбираем показатель степени так, чтобы абсолютное значение мантиссы оставалось больше или равным 1, но меньше основания числа».

Давайте посмотрим на пару примеров!

Если бы у нас было десятичное число 50010 и мы хотели бы записать его в экспоненциальной форме, мы могли бы записать его как 500 x 10 0 или 50 x 10 1 .

В нормализованной форме, однако, мы бы применили вышеупомянутое правило и переместили бы точку счисления так, чтобы только одна цифра, больше или равная 1 и меньше чем (в данном случае) 10, была слева от точки счисления.

В данном случае это будет означать перемещение нашей системы счисления на два места влево, чтобы получилось 5,0 x 10 ? .

Затем нам нужно будет вычислить нашу экспоненту. Чтобы вернуться к исходному числу, нам нужно переместить точку счисления на два места вправо. Помните, что мы узнали ранее? Если нам нужно переместить точку счисления вправо, чтобы вернуться к нашему исходному числу, это означает, что показатель степени положительный. Это дает нам: 5,0 x 10 2 .

Давайте посмотрим на более сложный пример, на этот раз в двоичном формате.

Что, если бы у нас было двоичное число 10,1 2 ? Что бы это было в научных обозначениях? Мы снова применяем правила: нам нужно иметь мантиссу, которая больше или равна 1 и меньше нашей числовой базы (которая на этот раз равна 2).

Это значит, что наша мантисса должна быть 1,01 x 2 ? . Чтобы вернуться к исходному числу, нам нужно переместить точку счисления на 1 позицию вправо. Что значит право? Это означает, что показатель положительный.

Последний пример.На этот раз посложнее!

Представьте, что у меня есть число 0,111 2 и я хочу записать его в нормализованной научной записи? Опять применяем правила. Нам нужна мантисса больше или равная 1 и меньше 2.

Это означает, что мы хотим записать мантиссу как 1.11 x 2 ? .

Теперь, чтобы вернуться к нашему исходному числу, нам нужно переместить нашу точку счисления на 1 позицию в… влево. Что мы узнали о движении влево? Это означает, что наша экспонента отрицательна.Это дает нам: 1,11 x 2 -1 .

Представления IEEE 754

Как вы, наверное, уже догадались, числа с плавающей запятой используются повсюду в современных вычислениях. Будь то процент рынка, который обновился до последней версии iOS, текущее положение и ориентация вашего iPhone в пространстве или сумма денег, поступающих на ваш банковский счет после выпуска вашего последнего блокбастера!

Из-за своего широкого использования формат, используемый для хранения чисел с плавающей запятой в памяти, был стандартизирован Институтом инженеров по электротехнике и электронике в так называемом IEEE 754 .Этот стандарт определяет ряд различных двоичных представлений, которые могут использоваться при хранении чисел с плавающей запятой в памяти:

  • Half Precision - Всего используется 16-битная память.

  • Single Precision - Всего используется 32-битная память.

  • Double Precision - Всего используется 64-битная память.

  • Quadruple Precision - Всего используется 128-битная память.

В каждом из этих случаев их основная структура следующая:

(-1) знак x мантисса x 2 показатель степени

Когда дело доходит до хранения чисел с плавающей запятой в памяти, сохраняются только три важные части этой базовой структуры:

На схеме ниже показано, что эти части хранятся в памяти:

Знак

Как я намекал выше, все четыре двоичных представления, определенные в стандарте IEEE 754, имеют старший бит в качестве бита знака и используют его для хранения знака общего числа.Подобно тому, что мы видели в предыдущих сообщениях, если бит знака очищен (значение 0), общее число положительное. Если бит установлен (значение 1), число отрицательное.

Показатель

Показатель степени представляет собой степень возведения мантиссы. При хранении представления с плавающей запятой в памяти всегда существует фиксированное количество битов экспоненты, а точное количество используемых битов определяется конкретным представлением IEEE 754 (одинарная точность, двойная точность и т. Д.).Мы рассмотрим это в ближайшее время.

Во всех случаях показатели степени в каждом из этих представлений должны иметь возможность представлять как положительные показатели (для представления очень больших чисел), так и отрицательные показатели (для представления очень малых чисел). Чтобы избежать сложностей, связанных с хранением экспонент в формате дополнения до двух, используется так называемое смещение экспоненты.

Показатель смещения

Exponent Bias - это где значение, сохраненное для экспоненты, смещено от фактического значения экспоненты смещением.Смещение - это просто число, которое добавляется к экспоненте, чтобы гарантировать, что сохраняемое значение всегда положительно. В таблице ниже показано количество бит, используемых для показателя степени в каждом из форматов, допустимый диапазон значений, которые могут иметь разные показатели до применения смещения, а также допустимые значения после применения смещения:

Представительство Биты Нормальный
Диапазон
(до смещения)

Смещение

Модифицированный
Диапазон
(смещение поста)

Примечания

Половинная точность

5

-14 до +15

+15

+1 к +30

Смещенные значения 0 (все биты очищены) и 31 (все биты установлены) имеют особое значение.

одинарной точности

8

-126 до +127

+127

+1 к +254

Смещенные значения 0 (все биты очищены) и 255 (все биты установлены) имеют особое значение.

Двойная точность

11

-1022 до +1023

+1023

+1 к +2046

Смещенные значения 0 (все биты очищены) и 2047 (все биты установлены) имеют особое значение.

Quadrupal Precision

15

-16382 до +16383

+16383

+1 к +32766

Смещенные значения 0 (все биты очищены) и 32767 (все биты установлены) имеют особое значение.

Mantissa (a.k.a. Signficand) Биты

В представлениях IEEE 754 мантисса выражается в нормализованной форме.Форматы следуют тем же правилам нормализации, что и в случае с научной нотацией, и ставят точку счисления после первой ненулевой цифры.

В двоичном формате мы также получаем приятный небольшой бонус!

Поскольку мы выражаем наши числа в двоичном формате, мы получаем преимущество, зная, что первая ненулевая цифра всегда будет 1 (в конце концов, у нас могут быть только единицы или нули). Учитывая это, мы можем отбросить этот первый бит, просто предполагая, что он есть, и вместо этого получить дополнительный (неявный) бит точности.

Когда числа сохраняются, мы сохраняем только ту часть мантиссы, которая представляет дробную часть числа, часть справа от точки счисления. В таблице ниже показано влияние неявного целочисленного бита и его влияние на общую точность:

Представительство

Прецизионные биты

Эффективная точность

Половинная точность

1 бит (неявный) + 10 бит (явный)

11 бит

одинарной точности

1 бит (неявный) + 23 бита (явный)

24 бита

Двойная точность

1 бит (неявный) + 52 бита (явный)

53 бит

Quadrupal Precision

1 бит (неявный) + 112 бит (явный)

112 бит

Сводка представлений IEEE 754

Таким образом, стандарт IEEE 754 определяет четыре основных формата для представления двоичных чисел с плавающей запятой в памяти:

Представительство

Всего бит

Бит знака

Биты Mantissa

Биты экспоненты

Половинная точность

16

1

1 неявный + 10

5

одинарной точности

32

1

1 неявный + 23

8

Двойная точность

64

1

1 неявный + 52

11

Quadrupal Precision

128

1

1 неявный + 112

15

В дополнение к этим форматам стандарт IEEE 754 также определяет ряд числовых символов, о которых также стоит знать.Мы кратко рассмотрим их в следующем разделе.

Специальные значения

, представляющий ноль

Как мы видели, при представлении чисел в формате с плавающей запятой и сохранении их в памяти мы записываем наши числа в нормализованной форме перед тем, как сбросить неявный установленный бит перед точкой счисления. Когда числа в памяти интерпретируются, неявный бит восстанавливается. Однако это неявное предположение о том, что бит сразу слева от точки счисления установлен в 1, вызывает проблемы.Что, если бы мы хотели представить ноль?

Чтобы обойти эту проблему, стандарт IEEE 754 определяет ноль как особый случай и представляет его с помощью экспоненты, равной 0, и мантиссы, равной 0. Поскольку знаковый бит все еще доступен, это приводит к значениям -0 и +0. стандарт определяет, что они должны сравниваться как равные.

Денормализованная форма

IEEE 754 также позволяет представлять числа в денормализованной форме. Если все биты в экспоненте равны нулю, но мантисса имеет ненулевое значение, говорят, что число хранится в денормализованной форме.В этом случае при интерпретации числа в памяти предположение о том, что слева от точки счисления установлен бит, снова игнорируется. Это приводит к числам в форме:

Представительство

Половинная точность

(-1) с x 0. f x 2 -14

одинарной точности

(-1) с x 0. f x 2 -126

Двойная точность

(-1) с x 0. f x 2 -1022

Quadrupal Precision

(-1) с x 0. f x 2 -16382

Где s - знак, а f - дробная часть мантиссы.

бесконечность

Стандарт IEEE

также определяет механизм представления бесконечности.Бесконечность представлена ​​показателем степени со всеми установленными битами и мантиссой со всеми очищенными битами. Опять же, знаковый бит остается в силе, что приводит к концепции + бесконечности и -infinity.

Не число (NaN)

Последнее, что представляет интерес в стандарте IEEE, - это концепция Not A Number (NaN). Используется для представления числа, которое не является действительным числом. Это представлено в памяти показателем степени со всеми установленными битами и ненулевой мантиссой. Чаще всего об этом сообщает ваш компилятор, обычно когда вы пытаетесь что-то разделить на ноль.

Обзор специальных значений

Таким образом, в таблице ниже показаны различные значения показателя степени и мантиссы, а также специальные значения, которые представлены в соответствии со стандартом IEEE 754:

Показатель

Мантисса

Представляемый объект

Значение 0 (т.е. Сохраненное значение == смещение)

Все биты установлены на 0

Ноль

Значение 0 (т.е. сохраненное значение == смещение)

Ненулевое значение

+/- Денормализованное число

Все биты установлены на 1

Все биты установлены на 0

+/- бесконечность

Все биты установлены на 1

Ненулевое значение

NaN (не число)

Сводка

На этом все на сегодня заканчивается для чисел с фиксированной и плавающей запятой.Прочитав этот пост, я надеюсь, что вы получите глубокое понимание различий между представлениями с фиксированной и плавающей запятой. Это позволит вам сделать гораздо более осознанный выбор о том, как хранить информацию в ваших приложениях в будущем. В следующих публикациях вы увидите, что это обеспечивает прочную основу для развития ваших знаний в области разработки под iOS.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *