最近在讀一些型別宣告空間以及進位制的基礎
大概整理了下筆記
在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所組成的序列來表示
可透過小算盤來查看
做一個位元的小實驗
可以看到輸出
所以 char 型別也可以裝16進位表示法,再透過%x去顯示出
我將char 改成 unsigned char再顯示出一次
前面6個f不見了,只剩最後兩位數表示
所以說 char 本身使用16進制表示的原型是 ffffffff 8 個f的空間嗎?
有點不懂 為何使用char宣告HEX的時候會有前面的預設f所代表的意義是什麼
而當我們在做進制運算符以及使用宣告空間時,用unsigned_char與char的差別是?
懇請各位大大解惑
char 的範圍是-128~127
unsigned char 的範圍是0~255
...
這告訴我們一件事「在寫程式解決問題時,依據數字的可能大小來選擇變數型態
」
寫這種不合規則的程式碼
char a = 205;
char b = 0x9e;
的目的是什麼?
又預期得到什麼結果?
c language memory allocation align
https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html
所看到的方式是 printf 處理的結果,
對 %x 的顯示, printf會將後面所傳的a和b轉型為 unsigned int 使用
因此原本是 char 和 unsigned char 在被轉型的過程中變成有意義了
如果把原本是 char 的 a, 於 printf 先自己轉 (unsigned char)a
就能跟宣告成 unsigned char 的 a 結果相同