Как целые числа преобразуются в строки под капотом? - PullRequest
3 голосов
/ 24 марта 2010

Полагаю, реальный вопрос в том, как преобразовать base2 / бинарный в base10. Наиболее распространенным применением этого, вероятно, было бы создание строк для вывода: превращение фрагмента двоичных числовых данных в массив символов. Как именно это сделано?

мое предположение: Видя, что для каждого числового значения, вероятно, нет предопределенной строки, я предполагаю, что компьютер просматривает каждый бит целого числа справа налево, каждый раз увеличивая соответствующие значения в местах обозначений char / base10. Если мы возьмем число 160 в двоичном виде (10100000), оно будет знать, что 1 на 8-м месте означает 128, поэтому оно помещает 1 в третий столбец, 2 во второй и 8 в третий. 1 в 6-м столбце означает 32, и это добавит эти значения во второе и первое место, перенеся при необходимости. После этого это легко преобразовать в реальные коды символов.

Ответы [ 4 ]

2 голосов
/ 24 марта 2010
while number != 0:
    nextdigit = number % 10
    AddToLeft(result, convert nextdigit to char)
    number = number / 10

Для читателя оставлено упражнение по обработке нулевых и отрицательных чисел.

1 голос
/ 24 марта 2010

Реализация printf в ядре Linux довольно читабельна. См. lib / vsprintf.c: number () .

Ну, ладно, в основном довольно читабельно. do_div - это макрос с ассемблером.

1 голос
/ 24 марта 2010

Как это сделать, зависит от платформы. Например, процессоры Intel имеют встроенную поддержку упакованной арифметики BCD (Binary Coded Decimal).

Допустим, что регистр al содержит двоичный код 00101010, десятичное число 42.

fushf ;store flags on the stack
std ;set decimal flag
sub bl, bl ;clear bl register
add bl, al ;add al to bl using BCD arithmetics
pop ;restore flags from stack

Регистр bl теперь содержит 01000010.

Старшие четыре бита содержат 0100 или десятичное число 4.
Младшие четыре бита содержат 0010 или десятичное число 2.

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

0 голосов
/ 24 марта 2010

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

Взять, к примеру, Java. целые числа, объявленные как int, на самом деле имеют длину 32 бита.

так, чтобы представить десятичное значение 0, мы должны иметь

1000000000000000000000000000000 <== начальная 1 (или ноль?) Означает, что она положительная или нет. </p>

Ну, это потому, что Java хранит значения int как наполовину отрицательные и наполовину положительные ...

Итак, я предполагаю, что Java будет делать следующее:

step1: получить содержимое из фрагмента 32-битной памяти, на который указывает «указатель» переменной или литерала

step2: вычислить его десятичное значение, чтобы большое число было преобразовано в 0

step3: (jdk5 +) используйте Int32.toString (), чтобы вернуть строковый литерал как «0»

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

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

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

    1    1  0  1  in binary

    1*2^3 + 1* 2^2 + 0*2^1 +1*2^0 = 13 in decimal     
...