別看了!C語言裏的unsigned int/char 看我就夠了

寫在前面:這裏是小王成長日誌,一名普通在校大學生,想在學習之餘將自己的學習筆記分享出來,記錄自己的成長軌跡,並且幫助可能需要的人,平時博客內容主要是一些學習筆記(系統的,會附帶思維導圖,就像我之前一個專欄-數據科學導論一樣),項目實戰筆記,一些技術的探究和自己的一些思考。歡迎大家關注,你們的每一個評論點贊關注我都會仔仔細細去看的。有任何問題歡迎交流,我會盡我所能幫助大家的,共創CSDN美好環境。



1.前置知識點

原碼,反碼,補碼


這裏關於計算機中原碼,反碼,補碼的知識受篇幅限制,這裏只是簡單介紹一下,更詳細的講解我過兩天整理會發出來


原碼:原碼是一個數在計算機中最簡單的表達形式,由符號位(0正1負)和數值位(絕對值)組成

  • 但是會有兩個0: +0(0000 0000) 和 -0(1000 0000)

反碼:原碼除符號位外按位取反(1與0的互換),只對負數有意義,正數反碼還是自己

例如:

原碼 反碼
0000 1111 0000 1111
1000 1010 1111 0101

補碼:反碼加1,還是隻對負數有意義,正數補碼還是自己.而負數在計算機中以其補碼形式表達
例如(以-5爲例):

原碼(符號位+數值位) 反碼(除符號位外按位取反) 補碼(反碼+1)
10000000 00000000 00000000 00000101 11111111 11111111 11111111 11111010 11111111 11111111 11111111 11111011
  • 補碼其實是方便計算機中減法而存在的,在計算機中,減去一個數等於加上一個數的補碼,這其中涉及到了“模”的概念,有興趣或者不懂的可以先去百度百科看看

    參考:
    百科-反碼
    百科-補碼
    百度文庫

2.有符號數和無符號數

有符號數和無符號數最主要的區別

  • 在計算機中無符號數用原碼錶示, 有符號數用補碼錶示

  • 就像他們的名字一樣區別就在於有無符號

    • 無符號數所有位數都用於表示數值
    • 有符號數和上面提到的原碼反碼補碼一樣,都由符號位(最高位 0正1負)和數值位組成

它們的表示範圍不同:

  • *在n位無符號數中,因爲所有位都用於表示數值,所以其範圍直接是0-2n-1)**(*共有2n個不同的數)
  • 而在有符號數中,由於最高位被用於表示數值的正負,所以其能表示的數值的最大值會縮水,但是會在負軸方向進行伸展

如下所示:

無符號 有符號
單字節(8位) 0~255 -128~127
雙字節(16位) 0~65535 -32768~32767
n位 0~ 2^n - 1 - 2^n ~ 2^n - 1
  • 其實可以感覺出來,有符號數和無符號數在同樣的位數下他們能夠表達的數的個數是一致的
    • 但是補碼中 +0 = -0 ,所以,-0 這個位置可以空出來,因此就在負數的區域中多出一位,由原來的 -0 ~ -127,變成 -1 ~ -128,也還是128位,而正數方向則是0 ~ 127,也是128個數,兩者是對稱的。(自己可以嘗試下對 -0 取補碼)

      原碼 反碼 補碼
      1000 0000 1111 1111 1000 0000
    • 也可以這麼理解:

      • 我們想一想,在 -1 ~ -128 中 -1 是最大的,所以 -1 是這個在這個情境下最大的負值,即爲1111 1111 ,
      • 而我們對於 1111 1111 -1 的值爲 1111 1110 其值爲-2(可以自己從補碼推回原碼)
      • 一直這樣減下去,直到最小的負值1000 0000 值就是-128
    • 這樣負數方向也是 -1 ~ -128,正數方向不變

    • 參考:C語言系列(二)有符號數和無符號數詳解)

二進制(1字節) 十進制值
1111 1111 -1
1111 1110 -2
1111 1101 -3
……… ………
1000 0001 -127
1000 0000 -128

3.有符號字符和無符號字符

  • 首先我們必須知道在C語言中插**char類型是隻佔一個字節(8位)**的
  • 其次,在C語言中,如果我們留意,我們是能夠發現char 字符類型的存儲方式其實是存字符的ascii碼,因此有些時候我們對字符和整數直接進行加減運算也是可行的。
 	  int main(void)
                {
                    char ch = 'c';
                    printf("%d",ch);//打印結果是99,爲'c'的ancii碼
                    printf("%c",ch+5);//打印結果爲h
                }
  • 但是在C語言中還有 unsigned char這個不省心的東西
    其實也蠻簡單的,在C語言中 unsigned char能表示的範圍是 0 ~ 255,跟普通的無符號數是一致的,
    而普通的char類型能表示的範圍是-128 ~127,這與有符號數是一樣的

  • 最後,關於這裏表示的範圍其實一般只在與整數進行運算時是需要注意的,而在表示字符時我們則不需要太過關心

4.參考:

  • 詳見原文超鏈接

都看到這裏了,各位哥哥姐姐叔叔阿姨給小王點個贊 關個注 留個言吧,和小王一起成長吧,你們的關注是對我最大的支持。


如果以上內容有任何不準確或遺漏之處,或者你有更好的意見,就在下面留個言讓我知道吧-我會盡我所能來回答。

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