【发布时间】:2021-03-05 11:12:57
【问题描述】:
我在很多地方都在寻找答案,但他们都说同样的话。 每当有人解释如何将十进制数转换为二进制时,都会显示连续除以二的技术。
如果我们在程序中声明一个数字(例如 int = 229),这没有任何意义,因为计算机不知道这个数字是什么,也不能除它两个。
据我了解,当声明 int 时,计算机会将数字视为简单字符。 要获得二进制数,对我来说唯一有意义的是这样的:
- 计算机使用 Ascii 表来识别符号(
2-2-9)- 它采用符号
9,找到与其实际二进制值“1001”( 9)[57 - 48]- 取第一个
2,找到“00110010”(50),二进制值“10”(2 ),但知道它是第二个符号,它乘以“1010”(10)得到“10100”( 20)- “10100”与“1001”之和 = 11101 (29)
- 它采用第二个
2,找到“10”(2),但知道它是第三个符号,它将它乘以(100) 并获得“11001000” (200)- 将“11001000”与“11101”相加 = 11100101 (229)
我走对了吗?
这个和逆转换(二进制到十进制)类似于 C 函数 atoi 和 itoa,但完全只使用二进制算术执行,利用一个小的知识库(ascii 表,二进制值 10、100 , 1000 等)。
我想澄清一点:
- 我已经讨论过浮点算术和二进制编码的十进制(计算器)等参数
- 我知道小数只对人类理解有用
- 示例中选择了 整数,因为它们很简单
问题与数字的存储方式无关,而与它们的解释方式有关。
谢谢!
【问题讨论】:
-
据我了解,当声明 int 时,计算机会将数字视为简单字符。这是不正确的!处理类型转换完全取决于编译器,而不是 CPU 本身。您声明一个 int 值,然后编译器将其解释为相应的二进制值,其位大小取决于 CPU 架构。您编写的所有值和代码只不过是编译器的 ASCII 流。然后编译器有几个阶段来处理这个流并解释为对 cpu 有意义的东西,即十六进制代码,也就是目标代码。
-
@Kozmotronik ,当然,它只是文本(程序也可以用 Microsoft Word 编写)但这不会改变我的问题的含义:编译器使用哪种方法转换字符 229 转入
11100101? -
这都是关于内存分配的。实际上并没有这样的转变。编译器只是将值放在它必须的位置。考虑这个例子: int a = 15; // 不管二进制转换。 // 编译器首先将其解释为机器的汇编代码,具体取决于架构。类似:MOV a,#15
-
@Kozmotronik,不管是在编译器中,在计算机中,在CPU中,在寄存器中,如果它的格式是文本,如果它的格式是十进制,数字15有在某处转换为二进制。
-
也许我不能举一个很好的例子,无论如何。最后我只能告诉你,数字 15 转换为二进制的唯一位置是十六进制代码部署到处理器或内存时,换句话说,当它成为可执行文件时。由于计算机可以由多种处理器组成,因此进行这种转换的工具可能是特殊的编程工具,或者是编译器本身(通用台式计算机就是这种情况)。剩下的就是asc2。可能是一名专业计算机科学家可能比我的示例和解释更能告诉你。祝你好运。
标签: c character-encoding binary computer-science decoding