iT邦幫忙

0

C對於unsigned char與 char型別的差異

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

在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。等等
https://ithelp.ithome.com.tw/upload/images/20220108/20137810goC8bNqeUg.jpg

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

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

可以看到輸出

  • a= ffffffcd
  • b= ffffff9e
    HEX=> 16進位 9e
    DEC=> 10 進位 158
    OCT=> 8進位 236
    BIN=> 2進位 1001 1110

所以 char 型別也可以裝16進位表示法,再透過%x去顯示出

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

懇請各位大大解惑

1
海綿寶寶
iT邦大神 1 級 ‧ 2022-01-08 23:54:04


char 的範圍是-128~127
unsigned char 的範圍是0~255
...
這告訴我們一件事「在寫程式解決問題時,依據數字的可能大小來選擇變數型態

寫這種不合規則的程式碼

char a = 205;
char b = 0x9e;

的目的是什麼?
又預期得到什麼結果?

看更多先前的回應...收起先前的回應...

好啦我知道了... 所以是超出他的值了
一時暈了沒想到
/images/emoticon/emoticon06.gif

其實並沒有超出他的值範圍(byte)
如果你寫

char a = 256; 
char b = -129;

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

再囉嗦一句
程式設計這個領域
光學「正確」(Why YES)的寫法就夠多的了
初期實在不必把時間花在測試「異常」(Why NOT)的寫法

這有點像我去問我的英文老師
「只因為 Google 沒說我錯,是否表示 is/are/am 可以混用」
https://ithelp.ithome.com.tw/upload/images/20220109/20001787Zacjksk7oc.png

1
一級屠豬士
iT邦大師 1 級 ‧ 2022-01-09 00:23:23

這本書上次在誠品看到,真的很棒!

1
wwx
iT邦好手 1 級 ‧ 2022-01-09 11:30:38

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

我要發表回答

立即登入回答