Распечатать число в десятичном виде - PullRequest
2 голосов
/ 13 декабря 2011

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

Но как насчет ситуации очень низкого уровня, когда у меня нет этой библиотеки. Я могу просто сказать, какой «характер» вывести. Как преобразовать число в десятичные символы?

Надеюсь, вы понимаете мой вопрос. Спасибо.

Ответы [ 4 ]

1 голос
/ 13 декабря 2011

Если целое число, разделите на десять, получите и результат, и остаток. Повторите процесс на результат до нуля. Остатки дадут вам десятичные цифры справа налево. Добавьте 48 для представления ASCII.

1 голос
/ 13 декабря 2011

Существует два способа печати десятичных дробей - на процессорах с инструкциями деления / остатка (современные процессоры такие же) и на процессорах с относительно медленным делением (8-разрядные процессоры более 20 лет назад).

Первый способ прост: int делит число на десять и сохраняет последовательность остатков в массиве.Как только вы разделите число до нуля, начните печатать остатки, начиная со спины, добавляя нулевой код ASCII ('0') к каждому остатку.

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

int pow10 = {10000,1000,100,10,1}

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

1 голос
/ 13 декабря 2011

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

  1. number mod 10 дает вам значение от 0 до 9 (4 в нашем примере), которое вы можете сопоставить с персонажем¹. Это крайняя правая цифра.

  2. Разделите на 10, отбрасывая остаток (операция, обычно называемая «целочисленным делением»):
    1234123.

  3. number mod 10 теперь дает 3, с точностью до секунды цифра.

  4. продолжаться до тех пор, пока number не станет равным нулю.


Сноска:

¹ Это можно сделать с помощью простого оператора switch с 10 случаями. Конечно, если ваш набор символов содержит символы 0..9 в последовательном порядке (например, ASCII), достаточно '0' + number.

0 голосов
/ 19 декабря 2011

Неважно, что такое система счисления, десятичная, двоичная, восьмеричная.Скажем, у меня есть десятичное значение 123 на десятичном компьютере, мне все равно нужно преобразовать это значение в три символа, чтобы отобразить их.Примем формат ASCII.Глядя на таблицу ASCII, мы знаем ответ, который ищем, 0x31,0x32,0x33.

Если вы разделите 123 на 10, используя целочисленную математику, вы получите 12. Умножьте 12 * 10, вы получите 120, разница3, ваша младшая цифра.мы возвращаемся к 12 и делим это на 10, давая 1, 1, 10 - это 10, 12-10 - это наша следующая цифра.мы берем 1, которое осталось делить на 10, и получаем ноль, который мы знаем, что мы закончили.цифры, которые мы нашли в порядке: 3, 2, 1. измените порядок на 1, 2, 3. Добавьте или ИЛИ 0x30 к каждой, чтобы преобразовать их из целых в ascii.

измените это, чтобы использовать переменную вместо123 и использовать любую систему нумерации, которая вам нравится, при условии, что в ней достаточно цифр для выполнения такой работы

Вы можете пойти и другим путем, разделив на 100 ... 000, какой бы ни был самый большой десятичный знак, который вы можете сохранитьили намерены найти и проложить себе путь вниз.В этом случае первое ненулевое значение имеет деление на 100, что дает 1. сохранить 1. 1 раз 100 = 100, 123-100 = 23. Теперь разделить на 10, это дает 2, сохранить 2, 2 раза 10равно 20. 23 - 20 = 3. когда вы делите на 1, вы сохраняете это значение в виде своей цифры.

здесь еще одно значение, которое нужно преобразовать в часы, минуты и секунды., вы можете разделить на 60, сохранить результат a, вычесть исходное число - (a * 60), оставив остаток в секундах, сохраните его.теперь возьмите a и разделите на 60, сохраните это как b, это ваше количество часов.вычтите a - (b * 60) это остаток, который составляет минуты, кроме этого.сделано часов, минут секунд.затем вы можете поделить часы на 24, чтобы получить дни, если хотите, и дни, а затем на 7, если хотите недели.

Был выдвинут комментарий об инструкциях по разделению.Деления очень дороги, и у большинства процессоров их нет.Дорого в том, что разделить, в течение одного часа, стоит вам ворота и власть.Если вы делите много часов, вы можете просто разделить программное обеспечение и сохранить ворота.По той же причине большинство процессоров не имеют процессора, вентилей и питания.(ворота означают более крупные чипы, более дорогие чипсы, более низкий доход и т. д.).Это не случай современного или старого или 64-битного или 8-битного или чего-то подобного, это компромисс между разработкой и бизнесом.например, у 8088/86 есть деление с остатком (также есть добавление bcd).Ворота / размер, если они используются, могут быть лучше поданы, чем для одной инструкции.Умножение попадает в эту категорию, не так плохо, но может быть.Если размеры операндов не сделаны правильно, вы можете сделать любую инструкцию (семейство) не такой полезной для программиста.В связи с этим возникает еще один момент: я не могу сейчас найти ссылку, но способ избежать деления, но преобразовать число в строку десятичных цифр, состоит в том, что вы можете умножить на .1, используя фиксированную точку.Я также не могу найти цитату о том, что настоящим программистам не нужна плавающая точка, связанная с отслеживанием десятичной точки самостоятельно.Это скользящее правило против калькулятора.Я считаю, что ссылка на статью о делении на 10 с помощью умножения где-то переполнена стеком.

...