内容:讲解有符号数运算和无符号数运算的区别
在51单片机中,所有的实数都是以补码的形式存在于内存中的。而各种算术运算也都是以补码的方式进行的。至于算出来的结果是正是负,完全在于你如何去看这个数。这里举三个例子来说明。
例1:计算100+10。
100的补码形式是0110 0100,10的补码形式是0000 1010。上面说了算术运算是以补码形式进行,所以结果是0110 1110。这时你把结果看成是有符号数还是无符号数,真值都是110。
例2:计算120+10。
120补码形式是0111 1000,10的补码形式是0000 1010,相加的结果为补码形式的1000 0010。如果把它看成无符号数,那么真值就是130。如果看成有符号数,则将补码转换成原码为1111 1110,真值就是-126。所以计算机做加法算出来的结果就是一个补码,它的真值为多少完全在于你如何看这个数。如果这题是无符号数运算,那么结果130符合预期;但如果这题是有符号运算,由于真值130超过了8位二进制数所能表示的范围,所以算出来的真值是一个负数。
前面知道了当进行120+10的有符号加法运算时,算出来的结果是-126。在程序设计中,正数加正数等于负数通常是一个非预期的结果,所以进行有符号数运算时需要通过判断OV标志位来判断是否有溢出,以便知道结果是否符合自己的预期。
例3:计算0E2H+52H。
传给单片机的立即数都是补码的形式,所以0E2H的补码加上52H的补码等于0011 0100,也就是如下图所示的0x34。此外,该加法有进位溢出,即Cy=1。
如果看成有符号数加法,则0E2H真值为-30,52H真值为82。0x34真值为52。82-30=52,所以结果符合预期。如果看成无符号数加法,则0E2H真值为226,52H和0x34真值同上。82+226=52,很明显因为进位溢出而导致运算结果不符合预期。所以,进行无符号数运算时要通过判断Cy标志位来判断是否溢出。