Poo*_*ria 4 math assembly unsigned signed integer
我已经超过学习汇编的一半了,我熟悉有符号和无符号整数如何以位形式呈现的概念,我知道这似乎是一个奇怪的问题,答案是非常明显的,但我'我想知道如果使用像加法这样的算术运算对于一对数字是有意义的,其中一个被认为是有符号而另一个被认为是无符号的,我想到了下面的多个例子会产生正确的结果:
10000001(1字节整数,被认为是无符号,相当于129)
+
11111111(1字节整数,被认为是有符号的(二进制补码系统),相当于-1)
10000000(1字节整数,无符号逻辑,相当于128)
现在,如果上限值在AL寄存器中,并且我们有以下指令代码(采用GAS格式):
addb -1, %al
Run Code Online (Sandbox Code Playgroud)
然后EFLAGS的操作一直在做后会通知实际上并没有发生溢出和寄存器将被设置进位标志(CF)也许是因为溢出方面有一个无符号数EFLAGS寄存器溢出标志(OF)应该参考.所以,如果做这样的事情是明智的,我会很困惑.
在数学上,您不添加有符号或无符号数字.只有模数为2 32的值(假设您有32位寄存器).这些值涵盖了2 32个连续整数的范围,但您可以自由地将该范围解释为几乎在任何地方开始."签名"和"未签名"只是两种解释.
换句话说,对于4位寄存器,"1011"的无符号解释是11,而签名解释是-5.但是只有一个值(数学家通常称之为"十一模2 4 ",因为数学家传统上喜欢无符号解释).例如,如果你将"0110"添加到该值(在有符号和无符号解释中都是"六"),那么你得到"0001",这是正确的值:减去五加六得一,十一加六是十七,当减模2 4时十七也等于一(十七是一加十六;"减模2 4 "大约除以十六[即2 4 ]并且仅保留余数).
另一种说法如下:数值的(二进制)数字在概念上是无穷大的.CPU寄存器仅保留最右边的32位.无符号解释是关于通常假设所有最左边的比特都为零.有符号的解释是关于通常假设所有最左边的比特具有与比特31相同的值(即,全部为零,或者全部为1).无论哪种方式,当您执行加法(或减法或乘法)时,进位从右向左传播,而不是相反的传播,因此这些被忽略的位的值对32位结果没有任何影响.因此,只有一个"添加"操作码,它不关心它的操作数是否在程序员的大脑中"签名"或"未签名".
在执行与模数算术不兼容的操作时,必须考虑签名.转换成用于显示的十进制数字序列就是这样的操作.然而,更常见的情况是比较.模数为2 32的值不是有序的; 它们处于一种循环循环中(当你添加1到2 32 -1,并减少模2 32时,你会回到0).只有在整数范围内考虑整数时,比较才有意义.此时,您必须决定是使用签名还是未签名的解释.这就是为什么x86处理器同时提供jg(如果更大,有符号解释则ja跳转)和(如果超过,则跳转,无符号解释).