让我来告诉你吧,其实,仅仅一个字节的数据,谁也看不出来,它是有符号数还是无符号数,
或者,它代表的是数字,还是代表一个字符... 那么如何区分? 主要看你如何定义变量..
1.指令编码不同,假设:无符号数加法的指令码为$06,带符号数的加法指令码为$07,这样,
CPU在取出某个加法指令时,根据指令编码,就知道操作数的类型了....
2.继续举例,你在源代码中定义 j: Integer;
则之后对 j 的操作所生成的CPU指令都是'符号型'的
如果,你定义了, j: DWORD;
则之后对 j 的操作所生成的CPU指令都是'无符号型'的....
3.一般计算机中整数采用的是补码表现形式,那么,无论加/减运算,操作数有/无符号,
都可以用同一套计算方法,则CPU可以不用象"1."那样在加减的时候作区分了....
4.但是在其他地方还是要区分的,象 8086 CPU 就有'无符号乘法'和'有符号乘法'两种
指令, 使用哪种指令, 就当做哪种类型来处理, 在高级语言中, 规则和我上面叙述
的'1.'类似, 主要看你在定义变量时, 用的是哪种类型(Integer/DWORD) ....
5.顺便一提, 象这种 if (j < 0) 如何区别 ? (无符号数肯定不会小于0, 即使最高位为1)
也是根据变量j的定义来使用相对应的CPU指令, 以 Intel 8086 汇编语言举例:
如果 j: DWORD , 则生成的汇编代码可以是:
CMP j, 0 // 比较两个数, 不保存结果, 仅影响PSW寄存器
JNC NEXT // 之前运算没有借位(CF = 0), 不小于, 则跳转
xxxx // 小于0时需要做的动作
NEXT: yyyy
如果 j: Integer , 则生成的汇编代码可以是:
CMP j, 0 // 比较两个数, 不保存结果, 仅影响PSW寄存器
JNL NEXT // 运算结果不小于0(SF xor OF = 0, 或 ZF = 1), 则跳转
xxxx // 小于0时需要做的动作
NEXT: yyyy
罗里罗嗦讲了一大堆,也不知讲清楚了没有,也许有的地方说的不对,仅供参考 ..