最近在讀一些型別宣告空間以及進位制的基礎
大概整理了下筆記

在c中,預設的基礎資料型別均為signed,現在我們以char為例,說明(signed) char與unsigned char之間的區別
首先在記憶體中,char與unsigned char沒有什麼不同,都是一個位元組,唯一的區別是,char的最高位為符號位,因此char能表示-128~127, unsigned char沒有符號位,因此能表示0~255,這個好理解,8個bit,最多256種情況,因此無論如何都能表示256個數字。
在實際使用過程種有什麼區別呢?
主要是符號位,但是在普通的賦值,讀寫檔案和網路位元組流都沒什麼區別,反正就是一個位元組,不管最高位是什麼,最終的讀取結果都一樣,只是你怎麼理解最高位而已,在螢幕上面的顯示可能不一樣。
但是我們卻發現在表示byte時,都用unsigned char,這是為什麼呢?
首先我們通常意義上理解,byte沒有什麼符號位之說,更重要的是如果將byte的值賦給int,long等資料型別時,系統會做一些額外的工作。
如果是char,那麼系統認為最高位是符號位,而int可能是16或者32位,那麼會對最高位進行擴充套件(注意,賦給unsigned int也會擴充套件)
而如果是unsigned char,那麼不會擴充套件。
這就是二者的最大區別。
同理可以推導到其它的型別,比如short, unsigned short。等等

資料的儲存
電腦內部具有記憶儲存空間,而該空間是以位元組(byte)為單位所組成:
(byte) (byte) (byte) (byte) (byte) (byte) (byte) (byte)

每個位元組(byte)由多個位元所構成(bit)
一個位元組一般由8個位元所構成。(註:實際個數為實作定義)
每個位元(bit)可以表示0或1兩種值 (bitvalue)
任何資料型別的資料都可以轉換成由一串0跟1所組成的序列來表示
可透過小算盤來查看
做一個位元的小實驗

可以看到輸出

  • a= ffffffcd
  • b= ffffff9e
    HEX=> 16進位 9e
    DEC=> 10 進位 158
    OCT=> 8進位 236
    BIN=> 2進位 1001 1110
  • 所以 char 型別也可以裝16進位表示法,再透過%x去顯示出

    我將char 改成 unsigned char再顯示出一次
    前面6個f不見了,只剩最後兩位數表示
    所以說 char 本身使用16進制表示的原型是 ffffffff 8 個f的空間嗎?
    有點不懂 為何使用char宣告HEX的時候會有前面的預設f所代表的意義是什麼
    而當我們在做進制運算符以及使用宣告空間時,用unsigned_char與char的差別是?

    懇請各位大大解惑

    才是超出他的值範圍(byte) 連 compile 都過不了 ![/images/emoticon/emoticon28.gif](/images/emoticon/emoticon28.gif)

    c language memory allocation align

    https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html

    可以買一些C的書來看
    https://www.books.com.tw/products/0010743408

    所看到的方式是 printf 處理的結果,
    對 %x 的顯示, printf會將後面所傳的a和b轉型為 unsigned int 使用
    因此原本是 char 和 unsigned char 在被轉型的過程中變成有意義了
    如果把原本是 char 的 a, 於 printf 先自己轉 (unsigned char)a
    就能跟宣告成 unsigned char 的 a 結果相同