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

2021-10-06 14:54:04 字數 1334 閱讀 6262

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

計算機要用二進位制編碼來表達數值的符號,最直觀的方法就是符號位。但為了保證基本算術運算在正負數上的一致性,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(進製):高位進/借位;

當加法系指令的二進位制結果大於11111111時會產生溢位,結果保留超過11111111的部分,並置溢位位為1。例如加法add指令:11111110+00000011=100000001=>00000001

標誌位:

由於低4位和高4位都進製了,所以ac和cy置1

對應的無符號運算:

254+3=1

對應的有符號運算:

-2+3=1

減法系的指令會產生「減不過」的情況。

減不過時cpu會給左數的最高位新增乙個1,使得比右數大,再做減法並置溢位。

例如減法sub指令:

00000010-00000011=>100000010-00000011=11111111

標誌位:

由於低4位和高4位都借位了,所以ac和cy置1,由於運算結果高位為1,pl置1

對應的無符號運算:

2-3=255

對應的有符號運算:

2-3=-1

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

計算機中的有符號數和無符號數

1.概念 在計算機中,可以區分正負型別的數,成為 有符號數 signed 無正負型別的數 只有整數型別 成為 無符號數 unsigned 簡明的說,無符號說就是其所有的位數都用來表示數值的大小,有符號數除最高位來表示數值的正負外 0表示正數 1表示負數 其餘各位用來表示數值的大小。舉個例子說明一下 ...

有符號數和無符號數

有符號和無符號整數 1.通常情況下,大多數字預設的是有符號數,比如 4,5 要想寫乙個無符號數必須在後面加u 比如 4u,5u 2.在計算機中有符號數是用補碼的形式來表示的,最高位是符號位。無符號數就是正數唄 正數的補碼和原碼相同。比如 1 在計算機中表示為 11111111 11111111 11...

無符號數和有符號數

人有十個手指頭,習慣了逢十進一,於是十進位製成了生活中的標準。程式的世界只有高低電平兩種狀態,更適合用二進位制來表示,於是二進位製成了程式世界的標準。對與無符號數來說,我們更喜歡談他們之間的轉化,十進位制是我們最習慣的進製,於是十進位制轉為r進製,r進製轉為十進位制變尤為重要。十進位制 r進製 整數...