计算机如何将二进制数转换为2的补码中的十进制等值

时间:2013-03-28 08:49:11

标签: binary numbers cpu computer-science

(我的问题只与2的补码有关)

假设我给你这个二进制数11111110,它在机器上存储为二进制补码,我希望你找到它的十进制等值。有些人可能会说它是-2而有些人可能会说这是254,因为他们不知道是签名还是未签名。 (我知道这是一个有符号的号码,所以我选了它的补码,加了1给了我2,所以答案是-2。但如果我不知道这个符号,我会说254。)

简而言之,计算机如何将存储在2的补码中的二进制表示转换为其十进制等值而不会出错?

计算机是否知道其标志? (如果是,则存储此信息的位置?)

2 个答案:

答案 0 :(得分:10)

从技术上讲,您不能将二进制表示的数字转换为小数,因为计算机没有任何存储工具来表示十进制数。

实际上这可能听起来很荒谬,因为我们总是处理十进制表示中的数字。但这些十进制表示实际上从未以十进制形式存储。计算机所做的只是在显示数字时将数字转换为十进制表示。这种转换与程序构建和库设计有关。

我将举一个关于C语言的小例子。在C中,您有有符号和无符号整数变量。在编写程序时,这些变量用于在内存中存储数字。谁知道他们的迹象?编译器。汇编语言具有签名和未签名的操作。编译器跟踪所有变量的符号,并为签名和未签名的案例生成适当的代码。因此,在编译时,您的程序可以完美地使用有符号或无符号整数。

假设您使用printf句子打印整数变量,并使用%d格式转换器以十进制表示形式打印值。此转换将由C的标准输入输出库中定义的printf函数处理。该函数从内存中读取变量,使用简单的基本转换算法将二进制表示转换为十进制表示。但算法的目标是char序列,而不是整数。所以这个算法做了两件事,它将二进制转换为十进制表示;它将位转换为char值(或ASCII码更精确)。 printf应该知道要成功进行转换的数字的符号,这个信息再次由编译时放置的编译器构造提供。通过使用这些构造printf可以检查整数是有符号还是无符号,并使用适当的转换方法。

其他编程语言遵循类似的路径。本质上,数字总是以二进制形式存储。签名或无符号表示由编译器/解释器知道,因此是常识。十进制转换仅出于美观原因而进行,转换目标是char序列或字符串。

答案 1 :(得分:0)

这是因为当您指定要使用带符号的数字时,计算机会将第一位[1]1111110解释为从其余位1[1111110]得到的数字的符号。所以1表示 - 而0表示+; a" char"可以存储-127到127之间的数字; a" unsigned char"可以存储0到255之间的数字;