c++中,把負值賦給unsigned 物件是完全合法的,其結果是初始值對無符號型別表示數值總數取模後的餘數。所以,如果把-1賦給8位的unsigned char,那麼結果是255,因為255是-1對256求模後的值。
1.從數學角度解讀:
取模運算時,對於負數,應該加上被除數的整數倍,使結果大於或等於0之後,再進行運算.
也就是:(-1)%256 = (-1+256)%256=255%256=255
2.計算機儲存角度:
計算機中負數是以補碼形式儲存的,-1的補碼11111111,轉換成無符號數即是255的二進位制編碼。
unsigned char uc; //宣告乙個無符號的字元,8位的,無符號字元型別的取值個數為256。
uc=-1; //將-1賦給無符號的字元型物件(變數),
//此過程會先將-1自動轉換為無符號數,即 11111111 11111111,然後賦值給uc
//但是uc只有8位,所以只儲存了 11111111 11111111 的低8位資料,其它的位
//就因為溢位而丟失了。-----因為溢位而丟失了其它位,就相當於取模運算了。
cout<<"uc as int is :"4294967254
4294967264
324294967264
4294967286
4294967276
20
負數賦值給無符號數的陷阱
有沒有人嘗試過將負數賦給乙個無符號整型變數?知不知道這樣做會發生什麼?還沒有嘗試的就讓我們來探索下無符號整型隱藏的秘密。先來看看下面 int main 執行的結果 4294967295 請按任意鍵繼續.你可能禁不住驚嘆 這麼大!沒想到吧,把乙個負數賦值給無符號整型變數,會產生這麼大的數!為啥呢?好,...
負數賦值給無符號數的陷阱
有沒有人嘗試過將負數賦給乙個無符號整型變數?知不知道這樣做會發生什麼?還沒有嘗試的就讓我們來探索下無符號整型隱藏的秘密。先來看看下面 int main 執行的結果 4294967295 請按任意鍵繼續.你可能禁不住驚嘆 這麼大!沒想到吧,把乙個負數賦值給無符號整型變數,會產生這麼大的數!為啥呢?好,...
怎樣判斷乙個數是無符號型別還是有符號型別
1.用函式過載的方法 char gettype unsigned int i char gettype int i 2.利用表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別。1 當a為無符號數時a a為0,而 1為有符號數,因此轉為無符號數,為乙個很大的數 2 當a為有符號數時...