在汇编程序里是没有无符号数和有符号数区分的。
加减运算指令是不区分有符号和无符号的,在计算机对有符号整数的表示只采取一种编码方式,不存在正数用原码,负数用补码的问题。
在汇编语言里声明变量的时候,没有signed和unsignde之分,汇编器全部将输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准,并且全部汇编成补码。也就是说,db-20汇编后为:EC,而db236汇编后也为EC。
db是分配一个字节,一个字节能表示的有符号整数范围是:-128~+127,那么db236超过了这一范围,+236的补码的确超出了一个字节的表示范围,那么拿两个字节是可以装下的,应为:00EC,也就是说+236的补码应该是00EC,一个字节装不下。00EC是两个字节,被截断成EC,当把236当作无符号数时,它汇编后的结果正好也是EC。
扩展资料
无符号数和有符号数的使用
#include<stdio.h>
#include<string.h>
intmain()
{
intx=2;
char*str="abcd";
inty=(x-strlen(str))/2;
printf("%d\n",y);
}
参考资料来源:百度百科—有符号数处理
参考资料来源:百度百科—无符号数
推荐于2017-09-27
举例来说:
内存里有 一个字节x 为:0x EC ,一个字节 y 为:0x 02 。当把x,y当作有符号数来看时,x = -20 ,y = +2 。当作无符号数看时,x = 236 ,y = 2 。
下面进行加运算,用 add 指令,得到的结果为:0x EE ,那么这个 0x EE 当作有符号数就是:-18 ,无符号数就是 238 。所以,add 一个指令可以适用有符号和无符号两种情况。
乘法运算就不行了,必须用两套指令,有符号的情况下用imul 得到的结果是:0x FF D8 就是 -40 。无符号的情况下用 mul ,得到:0x 01 D8 就是 472 。
2013-04-01
2013-04-01