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不知道号码是签名还是未签名.当编译器创建机器语言文件时,它会选择要执行的正确操作以使用该编号进行数学运算.例如,如果您将变量声明为有符号类型,那么以机器语言执行的操作将是将该内存位置视为有符号值的操作.
在任何类型的任何软件中,总是在您解释您赋予其意义的数据时.内存中的一个字节可以是有符号或无符号数字,或字符,音乐文件的一部分,或图片中的像素等.赋予它意义的是你如何使用该字节.