Binary 负数存储为2';在内存中,CPU如何知道它是否';是消极的还是积极的?

Binary 负数存储为2';在内存中,CPU如何知道它是否';是消极的还是积极的?,binary,cpu-architecture,numeric,sign,twos-complement,Binary,Cpu Architecture,Numeric,Sign,Twos Complement,-1可以用4位二进制表示为(2的补码)1111 15也表示为1111 那么,当CPU从内存中获取值时,它如何区分15和-1呢 在编译器级别,区别是基于数据类型的。如果数据类型为int,则为该变量分配4个字节(在C中)。所以2的补码中的15是00000000000000000000001111,而-1是11111111111111111111111。然后,编译器将其转换为CPU的相应操作码。CPU执行这个操作码,在这个级别上,一切都是1和0的形式 当一个字节从一个地方移动到另一个地方时,CPU不关

-1可以用4位二进制表示为(2的补码)1111

15也表示为1111


那么,当CPU从内存中获取值时,它如何区分15和-1呢

在编译器级别,区别是基于数据类型的。如果数据类型为int,则为该变量分配4个字节(在C中)。所以2的补码中的15是
00000000000000000000001111
,而-1是
11111111111111111111111
。然后,编译器将其转换为CPU的相应操作码。CPU执行这个操作码,在这个级别上,一切都是1和0的形式

当一个字节从一个地方移动到另一个地方时,CPU不关心它是保持-1还是15。没有所谓的“签名移动”(到相同大小的位置-对于较大或较小的目的地,有签名移动)


CPU在对字节进行算术运算时只关心表示。CPU根据您(或代表您的编译器)选择的操作码知道是执行有符号算术还是无符号算术。

CPU不知道数字是有符号的还是无符号的。当编译器创建机器语言文件时,它选择要执行的正确操作,以使用该数字进行数学运算。例如,如果您将变量声明为有符号类型,那么要在机器语言中执行的操作将是将该内存位置视为有符号值的操作


在任何类型的软件中,总是在解释数据时赋予它意义。内存中的字节可以是有符号或无符号的数字、字符、音乐文件的一部分或图片中的像素等。赋予它意义的是如何使用该字节。

前面的大多数答案都提到了单独的操作码。对于乘法和除法等更复杂的运算,这可能是正确的,但对于简单的加法和减法,这不是CPU的工作方式

CPU将有关指令结果的数据保存在其标志寄存器中。在x86(我最熟悉的地方)上,这里最重要的两个标志是“溢出”和“进位”标志

基本上,CPU不在乎数字是有符号的还是无符号的,它对它们都一视同仁。当数字超过其可包含的最高无符号值时,将设置进位标志。溢出标志在超出或低于无符号数字的范围时设置。如果您使用的是无符号数字,请检查进位标志并忽略溢出标志。如果您使用的是有符号的数字,请检查溢出标志并忽略进位标志

以下是一些例子:

未签名:

1111(15)+1111(15)=1110(14)

现在要做的是检查进位标志,在本例中,它包含一个给出最终结果的标志

1110(30)

签字:

1111(-1)+1111(-1)=1110(-2)

在这种情况下,忽略进位标志,溢出标志应设置为零

未签名:

0111(7)+0111(7)=1110(14)

当您检查进位标志时,它应该为零

签字:

0111(7)+0111(7)=1110(-2)

在这种情况下,将设置溢出标志,这意味着加法中存在错误


因此,总的来说,根据您对数字的理解,数字只是有符号的或无符号的,CPU提供了工具来区分它们,但不能自己区分。

最小的可访问单元是1字节。这是8位。在8位表示中,15存储为00001111。编译器从符号位区分正数和负数。MSB是一个符号位。如果为0,则表示正数。如果为1,则表示负数。15的二进制表示形式的MSB为0。表示正数,00001111对应+15。-1的8位二进制是11111111,因为它的MSB是1,所以它是一个负数。编译器首先取其2的补码,然后用负号显示数字。请记住,如果有8位存储数字,那么可以存储在其中的最大值是(2^7)-1,它在表示中使用7位。这意味着对于正数,MSB始终为零。正如在你的问题中,如果我们假设取4位来存储数字,那么3位可用于存储值,因为最后一位是保留符号的保留位。对于3位,可存储的最大值为(2^3)-1=7。这意味着15不能存储在4位中。因此,编译器始终将1111视为-1

请点击下面的链接进入YouTube频道,该频道有如此棘手的问题。
www.YouTube。com/watch?v=ZxRHOT3pzx4

在2的补码中表示15位,我们需要5位。2'补码的范围是
-16到15,因此值变为01111,这里MSB位为0,因此其-1的正值将变为11111,这并没有回答CPU如何产生差异的问题。CPU不知道C。编译器为每个数字分配一个预定义的字节数(不考虑语言,C只是一个例子)。如果二进制版本包含所有1,则其-1,如果在0位之前至少有1,则其解释为非0整数值。你明白了吗?这就提出了一个问题,CPU如何区分32位值-1和2^32-1,这两个值在两个补码中具有相同的位表示形式?不。问题是:假设我有
无符号字符I=255即二进制的
11111111
11111111
将是带签名字符的-127。CPU无法访问语言中的类型信息。它怎么能分辨出哪个是哪个?(我并不是说这个问题实际上是可以回答的,因为它完全取决于实际的CPU/指令集,只是说你的答案不能回答这个问题。)@amal当它是一台4位机器时,会发生什么?有符号和无符号