5

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

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

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

计算机知道它的符号吗?(如果是,那么这些信息存储在哪里?)

4

2 回答 2

11

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

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

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

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

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

于 2013-03-28T09:19:02.677 回答
0

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

于 2014-02-24T16:33:54.657 回答