搜尋

首頁  >  問答  >  主體

C++中的無符號型別與帶符號型別問題

問題1:
「當我們賦給無符號類型一個超出它表示範圍的值時,結果是初始值對無符號類型表示數值總數取模後的餘數」這句話怎麼理解?例如把-1賦給8bit大小的無符號char所得的結果為何是255?
我的理解是這樣:假如-1=11111111(第一個1表示負),當把其表示為無符號時則11111111=255
那麼為什麼賦給帶符號類型一個超出它表示範圍的值時結果是未定義?
問題2
當算術表達式中同時出現有符號和無符號類型時,有符號類型的值是正數時轉換成無符號後的值是否和轉換前一樣?例如int a=1,unsigned b=1,輸出a b時a會先轉換成無符號,轉換後的還a等於1麼?若int a=-1,unsingned b=2,輸出a b時a會先轉換成無符號型,轉換後的a等於幾?
問題2:

如圖第四個長註。
書上說的意思是,不管a b的結果是什麼,只要a和b一個是無符號一個是帶符號,就要先把帶符號那個轉換成無符號再執行加法。而我實際運行了圖中的程式後我認為是只有當a b的結果是負數且a和b一個是帶符號一個不帶符號時,才把結果轉為無符號。
到底哪一種才是對的?

给我你的怀抱给我你的怀抱2740 天前1524

全部回覆(1)我來回復

  • 巴扎黑

    巴扎黑2017-06-19 09:09:29

    問題1
    其實解釋上面說的複雜了,你如果從記憶體的角度來看,就會發現很簡單。無符號和有符號的區別不在於內存的存儲,而在於內存的獲取。例如你舉例的-1賦值8bit的例子,如果是無符號,那麼只會填滿最後8個二進位​​,其餘的會被拋棄掉。因為這個8bit是無符號,所以這裡面所有的二進位都表示數字,所以是255。但如果是有符號的8bit,其中首位二進位表示符號位,但是賦值的時候,-1的符號位並沒有成為8bit資料的符號位,所以8bit資料的符號位其實是無效的,所以這個賦值也就出錯了。那句話的意思是(-1)%256=255,其中256是無符號8bit的總數(或說是範圍)。
    問題2
    上面說過了,其實有符號和無符號的儲存方式是相同的,只是讀取方式不同。有符號的會把首位當做符號位,無符號的會把首位當做數字位。在記憶體中是一樣的,你的例子中,第一次a + b的結果,用二進位表示是一堆1。如果你直接輸出,由於轉成了unsigned,也就是兩個unsigned相加,結果是unsigned,那一堆1的二進製作為unsigned輸出是4294967295,但是如果把a+b賦值為了sum,sum存儲值的時候記憶體裡依舊是一堆1,但由於sum是有符號int,讀取的時候,首位被當做了符號位,所以讀出來的值是-1。
    所以你問題2裡面,不是在運算時候沒有轉換,而是因為數值儲存時候只考慮二進制,這個對於有無符號並無差別。只有在讀取的時候才去判斷符號位,所以才導致了輸出結果的差異。

    回覆
    0
  • 取消回覆