有符號數和無符號數在計算機中怎麼區分?

確如題主所說,計算機中存儲的任何數據都是二進制形式,單看數據是無法認定其格式和內容的。

計算機要用二進制編碼來表達數值的符號,最直觀的方法就是符號位。但爲了保證基本算術運算在正負數上的一致性,x86計算機對負數採用了特殊的編碼方式,即補碼。

爲什麼補碼這麼巧妙實現了正負數的加減運算?參見維基百科:
補碼
-1的二進制表示

下面結合題主提到的寄存器狀態舉個例子。
爲簡化起見,我們8位二進制數來講。
先看8位二進制與無符號數和有符號數的對應二進制
無符號 有符號
00000000 0 000000001 1 1

01111110 126 126
01111111 127 127
10000000 128 -128
10000001 129 -127

11111110 254 -2
11111111 255 -1

按照上述對應關係,我們可以把二進制運算解釋爲有符號或無符號的十進制運算。
只有算術運算纔會有正負號問題,而算術運算中最主要的就是加法系列指令和減法系列指令。

範圍內的運算咱們不關心,主要看看超出範圍的運算如何處理。
當運算超出範圍後,CPU會改變標誌寄存器中的值(置1),來表示當前的運算結果。

算術運算主要用到的標誌位如下。
OV(溢出):運算結果超過數值表達範圍(比如8位數運算超過256);
ZR(零):運算結果爲0時;
PL(符號):運算結果的最高位爲1。
AC(輔助進位):低4位是否向高4位進/借位;
CY(進位):高位進/借位;

  1. 當加法系指令的二進制結果大於11111111時會產生溢出,結果保留超過11111111的部分,並置溢出位爲1。例如加法add指令:11111110+00000011=100000001=>00000001
    標誌位:
    由於低4位和高4位都進位了,所以AC和CY置1
    對應的無符號運算:
    254+3=1
    對應的有符號運算:
    -2+3=1

  2. 減法系的指令會產生“減不過”的情況。
    減不過時cpu會給左數的最高位添加一個1,使得比右數大,再做減法並置溢出。
    例如減法sub指令:
    00000010-00000011=>100000010-00000011=11111111
    標誌位:
    由於低4位和高4位都借位了,所以AC和CY置1,由於運算結果高位爲1,PL置1
    對應的無符號運算:
    2-3=255
    對應的有符號運算:
    2-3=-1

其他的算術運算較複雜,但都可以用類似的方法分析。因超出問題範圍,此處不再贅述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章