负数在内存中存储为2的补码,CPU如何知道它是负数还是正数?

MCG*_*MCG 21 binary unsigned sign numeric microprocessors

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

图15也表示为1111.

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

Pet*_*vdL 16

当CPU从一个地方移动到另一个地方时,CPU不关心字节是保持-1还是15.没有"签名移动"这样的东西(到相同大小的位置 - 有更大或更小目的地的签名移动).

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


小智 9

大多数先前的答案提到了单独的操作码.对于像乘法和除法这样的更复杂的操作,这可能是正确的,但对于简单的加法和减法而言,这可能不是CPU的工作方式.

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

基本上,CPU不关心数字是有符号还是无符号,它们都将它们视为相同.当数字超过它可以包含的最高无符号值时,将设置进位标志.溢出标志在超过或低于无符号数的范围时设置.如果使用无符号数字,则检查进位标志并忽略溢出标志.如果使用带符号的数字,请检查溢出标志并忽略进位标志.

这里有些例子:

无符号:

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

你现在做的是检查进位标志,在这种情况下包含一个给出最终结果的标志

1 1110(30)

签:

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

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

无符号:

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

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

签:

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

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

总而言之,根据您对它的解释,数字只是有符号或无符号,CPU为您提供了区分它们的工具,但不能区分它们.


小智 7

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

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