有符号数与无符号数的探讨
这个问题,要是简单的理解,是很容易的,不过要是考虑的深了,还
真有些东西呢。
下面我就把这个东西尽量的扩展一点,深入一点和大家说说。
一、只有一个标准!
在 汇编语言层面,声明变量的时候,没有 sig ned 和 u nsign d e 之
分,汇编器统统,将你输入的整数字面量当作有符号数处理成补码存
入到计算机中,只有这一个标准!汇编器不会区分有符号还是无符号
然后用两个标准来处理, 它统统当作有符号的!并且统统汇编成补
码!也就是说,d b -2 0 汇编后为:EC ,而 d b 2 3 6 汇编后也为
EC 。这里有一个小问题,思考深入的朋友会发现,db 是分配一个
字节,那么一个字节能表示的有符号整数范围是:-1 2 8 ~ +
1 2 7 ,那么 d b 2 3 6 超过了这一范围,怎么可以?是的,+ 2 3 6 的
补码的确超出了一个字节的表示范围,那么拿两个字节(当然更多的
字节更好了)是可以装下的,应为:0 0 EC ,也就是说 + 2 36 的补
码应该是 0 0 EC ,一个字节装不下,但是,别忘了“截断”这个概念,
就是说最后汇编的结果被截断了,0 0 EC 是两个字节,被截断成
EC ,所以,这是个“美丽的错误”,为什么这么说?因为,当你把 2 3 6
当作无符号数时,它汇编后的结果正好也是 EC ,这下皆大欢喜了,
虽然汇编器只用一个标准来处理,但是借用了“截断”这个美丽的错误
后,得到的结果是符合两个标准的!也就是说,给你一个字节,你想
输入 有符号的数,比如 - 2 0 那么汇编后的结果是符合有符号数的;
如果你输入 2 3 6 那么你肯定当作无符号数来处理了(因为 2 3 6 不
在一个字节能表示的有符号数的范围内啊),得到的结果是符合无符
号数的。于是给大家一个错觉:汇编器有两套 标准,会区分有符号
和无符号,然后分别汇编。其实,你们被骗了。:- )
二、存在两套指令!
第一点说明汇编器只用 一个方法把整数字面量汇编成真正的机器
数。但并不是说计算机不区分有符号数和无符号数,相反,计算机对
有符号和无符号数区分的十分清晰,因为计算机进行某 些同样功能
的处理时有两套指令作为后备,这就是分别为有符号和无符号数准备
的。但是,这里要强调一点,一个数到底是有符号数还是无符号数,
计算机并不知 道,这是由你来决定的,当你认为你要处理的数是有
符号的,那么你就用那一套处理有符号数的指令,当你认为你要处理
的数是无符号的,那就用处理无符号数的那 一套指令。加减法只有
一套指令,因为这一套指令同时适用于有符号和无符号。下面这些指
令:m ul div m ovz x … 是处理无符号数的,而这些:im ul idiv