計算機如何識別有符號數和無符號數?

時間 2021-05-31 13:47:30

1樓:

CPU並不知道送進來的是有符號數還是無符號數,都統一用補碼來計算(補碼運算不在乎是有符號還是無符號),然後把標誌位設定好,上層讀資料的時候按照需要的邏輯結合標誌位來得到相應的資訊。

2樓:朱涵俊

計算機只有01,無所謂符號,包括浮點,整數。

那麼乙個數字儲存的計算機中記憶體中,到底代表什麼意思,就看程式設計師怎麼處理。比如0xff,在8位機,程式設計師把他當做無符合數,就是255,當做有符號數,就是-1,程式設計師還能把當做乙個字元。譬如說用printf列印,%u,%d,%x,%c都可以列印同乙個變數,記憶體中完全一樣,但是列印出來就不一樣。

除了程式設計師如何理解這個資料之外,還有乙個區分,就是指令。

有人已經說了,符號乘法跟無符號乘法是2個指令,你用哪條指令,就是指定該資料是否有符號。

還有減法,減了之後除了結果外,還有一些標誌位,有沒有借位,是否為0等,減了之後後面根的那個跳轉指令不同,資料的意義也不同。比如ja用於無符合數,jg用於有符合數。1-(-1),就是判斷1跟-1哪個大,你用jg,就是1大,用ja就是-1大。

那麼該用什麼指令呢,總不能都寫彙編吧。於是有高階語言有了型別定義,如c語言,明確定義乙個變數是否有符號。那麼編譯器編譯的時候就可以知道用哪條指令了。

3樓:麥大麥

對於計算機來說,補碼(two's complement)是非常好的一種解決數值計算問題。首先,我們來理解什麼叫"模"(module)。還是用鐘錶來舉例子。

假如現在是4點,那麼時鐘往前撥動8小時是多少?計算:4+(24-8)=20時這中間的24就是模。

其次,我們來看二進位制。對於8位元數,其模為10000_0000。又舉個例子4-9(00000100-00001001)即等價於00000100+(10000_0000-00001001)也就是00000100+11110111(補碼)=11111011(-5的補碼)。

從上面可以看出,採用補碼的形式,可以將減法變為加法。這也是這個計算機採用補碼的主要原因。由此也可以看出,計算機中的有符號數,1開頭是負數0開頭是正數,是因為運算結果如此,而不是人為規定。

他是結果,不是規定如此。最後,其他的碼型,比如,One's complement,D1,格雷碼,RNS碼等等。只有乙個目的,讓硬體實現起來節省資源,提高效率。

這一類問題,可以研究number system,數論,餘數系統等知識。

4樓:SuperSodaSea

補充一下,x86上的加減法指令不需要區分有無符號,所以用的是同樣的add/sub指令,而乘除法需要區分有無符號,所以有兩種指令:mul/div(用於無符號)和imul/idiv(用於有符號),而資料本身是不包含它是有符號還是無符號的資訊的。更進一步地說,資料本身其實是不包含型別資訊的,區分型別全靠運算元據的指令。

(當然,這是在CPU的層面上說的。)

5樓:暮無井見鈴

就 x86 而言(其他平台沒接觸過):

CPU 所處理的暫存器、記憶體中的數本身無符號資訊。CPU 做加減法時會一起做無符號數的進製/有符號數的溢位標誌,並不專門對待有符號數和無符號數。

符號性區別是只屬於(中)高階語言的概念,反映到機器語言上,是跟運算及與其結果相關的指令上的區別,而不會反映到 CPU 所處理的數本身。

6樓:陳碩

用補碼的好處就是不用區分,因為加減法運算規則相同,你當它是啥就是啥。

Two』s Complement Adder/Subtractor

無符號數的減法如何實現?

大汪 在計算機內部,無符號數的加減法等同於補碼進行加減法,只是最後對於結果的解釋不一樣 舉個栗子 情形一 unsignedA,B A 0 B 1 A B 則A B進行的其實是 A 補 B 補,就是 0 補 1 補 00000000H FFFFFFFFH FFFFFFFFH 只不過最後的結果是按照無符...

計算機如何做符號運算?

Ember Edison 對於要求純符號解的場合,並不是通過數值近似來逼近符號結果。此處是業界知名軟體Wolfram Mathematica的內部實現注釋。Wolfram 語言與系統關於內部實現的一些注釋更加人話和幼兒園化的概論是,就拿你關心的微積分作為例子,Wolfram在軟體內植入了廣義 Ris...

無符號數相減後若是負數,結果會如何?

wujun 對於計算機編譯器而言是沒有減法的,減法是首先對無符號數取加法的逆元,在進行加法 所以我們首先加上x y x y.在上面的情況中單 x 當 x y.我們有y x 2 w x y 愛你一萬年噢噢噢 10 42 32,若機器字長為32位,而且採用補碼,則 32表示為FFFFFFE0H 十六進製...