如何将整数转换为引擎盖下的字符串?

时间:2010-03-23 23:05:19

标签: casting numbers tostring

我认为真正的问题是如何将base2 / binary转换为base10。最常见的应用可能是为输出创建字符串:将一大块二进制数值数据转换为字符数组。究竟是怎么做到的?

我猜: 看到可能没有为每个数值预定义字符串,我猜测计算机从右到左遍历整数的每个位,每次都在char数组/ base10表示法中增加适当的值。如果我们以二进制(10100000)取数字160,它将知道第8位的1表示128,所以它将1放入第3列,2放在第二列,8放在第三列。第6列中的1表示32,它会将这些值添加到第二个和第一个位置,如果需要的话可以继续。在此之后,它可以轻松转换为实际的字符代码。

4 个答案:

答案 0 :(得分:2)

while number != 0:
    nextdigit = number % 10
    AddToLeft(result, convert nextdigit to char)
    number = number / 10

这是留给读者处理零和负数的练习。

答案 1 :(得分:1)

如何完成取决于平台。例如,英特尔类型处理器内置支持打包的BCD(二进制编码十进制)算法。

假设寄存器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。

要将其转换为字符,请从寄存器中提取4位值,然后添加48以获取数字的字符代码。

答案 2 :(得分:1)

Linux内核中printf的实现非常易读。请参阅lib/vsprintf.c:number()

好吧,好吧,大部分都很可读。 do_div是一个包含汇编程序的宏。

答案 3 :(得分:-1)

首先,这是一个棘手的问题,因为它显然是基于平台和语言。

以Java为例。声明为int的整数实际上是32位长。

所以要表示小数值0,我们应该

1000000000000000000000000000000< ==前导1(或零?)表示它是否为正。

嗯,这是因为Java存储int值为half negative和half positive ...

所以,我的猜测是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