- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(我的问题仅与 2 的补码有关)
假设我给你这个二进制数 11111110,它作为二进制补码存储在一台机器上,我想让你找到它的十进制等价物。有些人可能会说它是 -2,而有些人可能会说它是 254,因为他们不知道它是有符号还是无符号。 (我知道这是一个带符号的数字,所以我取了它的补码并加了 1,得到了 2,所以答案是 -2。但如果我不知道这个符号,我会说 254)。
简而言之,计算机如何将这种以 2 的补码形式存储的二进制表示转换为十进制等价的而不出错?
计算机知道它的符号吗? (如果是,那么这些信息存储在哪里?)
最佳答案
技术上你不能转换 将二进制表示的数转换为十进制数,因为计算机没有任何存储设施来表示十进制数。
实际上这听起来可能很荒谬,因为我们总是在处理十进制表示的数字。但是这些十进制表示实际上从未以十进制存储。计算机唯一能做的就是在显示时将数字转换为十进制表示。而这种转换与程序构建和库设计有关。
我将举一个关于 C 语言的小例子。在 C 中,您有有符号和无符号整数变量。在编写程序时,这些变量用于在内存中存储数字。谁知道他们的标志?编译器。汇编语言具有有符号和无符号操作。编译器跟踪所有变量的符号并为有符号和无符号情况生成适当的代码。所以你的程序在编译时可以完美地处理有符号或无符号整数。
假设您使用了 printf
句子打印一个整数变量,你使用了 %d
格式转换器以十进制表示打印值。此转换将由 printf
处理C 标准输入输出库中定义的函数。该函数从内存中读取变量,使用简单的基数转换算法将二进制表示转换为十进制表示。但是算法的目标是一个字符序列,而不是一个整数。所以这个算法做了两件事,它都将二进制转换为十进制表示;并将位转换为字符值(或者更精确的 ASCII 码)。 printf
应该知道数字的符号以成功进行转换,并且此信息再次由编译时放置的编译器构造提供。通过使用这些结构 printf
可以检查整数是有符号还是无符号并使用适当的转换方法。
其他编程语言遵循类似的路径。本质上,数字总是以二进制形式存储的。有符号或无符号表示为编译器/解释器所知,因此是常识。十进制转换只是为了美观而进行,转换的目标是字符序列或字符串。
关于binary - 计算机如何将二进制数转换为 2 的补码形式的十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15677512/
我是一名优秀的程序员,十分优秀!