CPU 只能用补码工作吗?

问题描述 投票:0回答:1

我对二进制补码和简单的 CPU 任务有一些基本的疑问。

CPU 是否总是以二进制补码工作?。如果不是,它怎么知道什么时候应用它进行减法。

从我的角度来看,我虽然 CPU 在其自然状态下操作位,但如果是这样,它如何进行复杂的数学运算?

另一方面,如果它只适用于二进制补码,那么一台 64 位计算机将有

2^63 - 1  possible numbers

我认为这是浪费一点。

如果 CPU 混合使用这两者,它如何知道何时使用二进制补码?据我所知,如果您使用二进制补码,则使用 1 位进行签名,因此如果我想以 8 位进行减法,例如:

256 + (-256)

您无法将此理解为 8 位负数的最大值 -128,因此您需要 9 位来执行此操作。

我尝试过使用 ChatGPT,尝试应用逻辑,阅读维基百科,观看关于它的 Computerphile 视频,但没有任何东西能解决我的问题,所以,我认为我在混淆事情。

提前致谢!

math cpu cpu-architecture subtraction twos-complement
1个回答
0
投票

大部分计算都是用无符号数完成的。无符号数在某种意义上可能是最原始的数字表示形式。在无符号形式中,每个位代表其在形式中位置的 2 次方的一个因数(1 或 0)。无符号形式不能支持负数。

寻址和寻址运算对于代码和数据都是极其常见的操作,所有寻址都是无符号的;没有负内存地址的概念。

CPU 是否总是以二进制补码工作?。如果不是,它怎么知道什么时候应用它进行减法。

不必知道,而且,这就是2的补码形式的美妙之处!无符号数的加法和减法对有符号数的作用相同,因此硬件设计通常不会为有符号数和无符号数提供单独的加法/减法,例如。

如果处理器支持 1 的补码,则必须有单独的指令来处理它们与处理无符号数。

事实上,这就是浮点数与整数的工作原理。单独的指令告诉处理器将某些数据视为 IEEE 浮点格式(恰好使用符号幅度而不是 2 的补码)。

决定将整数视为有符号还是无符号是程序的一个特性,从程序员传递到 C 或其他语言程序中,然后由编译器传递到程序的机器代码中。

所以,处理器如何知道的答案是它被程序告知,而机器代码程序被 C(或其他)程序告知。

虽然 CPU 在其自然状态下操作位,但如果是这样,它如何进行复杂的数学运算?

位只是存储。处理器不知道或不关心某些位是/是 2 的补码还是无符号或其他。

电路在每条机器代码指令中解释位,并且为多种算术和逻辑构建多种电路并不困难。

程序通过选择合适的机器码指令序列来选择使用什么电路,处理器愉快地执行提供的机器码序列。

请注意,在 C 中,我们声明具有大小和符号的(整数)变量。因此,我们可能有一个字节大小且无符号的变量,以及另一个 32 位宽且有符号的变量。在像 C 这样的编程语言中,一旦我们声明了一个变量,它的数据类型就不会改变,并且该变量在程序运行期间具有该大小和符号。

然而,处理器不读取数据声明——它只读取机器代码指令。因此,每次程序使用无符号字节大小的变量时,它的机器代码都会告诉处理器该数据类型信息;与带符号的 32 位整数类似。编译器的工作之一是确保每次读取或写入变量时处理变量的一致性。

在机器代码中,没有强制执行一致性,这是汇编语言更容易出错的原因之一——没有编译器确保一致性。处理器检查某些错误(如空指针取消引用),但它不关心是否有错误,例如前一分钟将一块存储视为无符号字节,下一分钟将有符号 32 位。处理器不关心你的程序是否有意义,它只是根据其指令集规范运行每条机器代码指令。

© www.soinside.com 2019 - 2024. All rights reserved.