回覆列表
  • 1 # 藍風24

    unsigned char是無符號位元組型,char型別變數的大小通常為1個位元組(1位元組=8個位),且屬於整型。整型的每一種都有無符號(unsigned)和有符號(signed)兩種型別(float和double總是帶符號的),在預設情況下宣告的整型變數都是有符號的型別(char有點特別),如果需宣告無符號型別的話就需要在型別前加上unsigned。無符號版本和有符號版本的區別就是無符號型別能儲存2倍於有符號型別的資料,比如16位系統中一個int能儲存的資料的範為-32768~32767,而unsigned能儲存的資料範圍則是0~65535。

    同樣,在32位系統中一個char型別一般為8個bit,所以能儲存的資料範圍為-128~127,而unsigned char則是0~255,字元型所儲存的資料是用來表示字元的,例如ASCⅡ或Unicode。

    關於char的符號(選自thinking in C++ 2nd vol1):

    signed

    is the default and is only necessary with char; char may or may not

    default to signed. By specifying signed char, you force the sign bit to

    be used.

    譯:有符號型別是預設(指的是對於其他整型來說)的型別並且僅對於char來說才是必須的。char有可能是signed也有可能是unsigned(我想這可能取決於編譯器或具體實現)。但透過顯式地指定一個char為signed,你就迫使其成為有符號的字元型

    在定義整數變數的型態的時候可以加上 unsigned 或是 signed, 例如 unsigned char unsigned short

    (int) unsigned long (int) unsigned int ---------- signed char signed

    short (int) signed long (int) signed int -------------- 上面 signed

    有加和沒有加是一樣的意義 加上 unsigned 以後, 1. 所需要的資料儲存空間和沒有加 unsigned 時是一樣的 2. 在使用

    printf() 列印時基本上你必須分清楚 unsigned 有影響到的是引數的傳遞, 使用 %d 或是 %u 基本上是看程式設計者自己的選擇

    int i=-1; printf("%d %u/n", i, i); 會印出 -1 4294967295 unsigned int i=-1;

    printf("%d %u/n", i, i); 也會印出 -1 4294967295 char i=-1; printf("%d %u/n",

    i, i); 還是會印出 -1 4294967295 但是 unsigned char i=-1; printf("%d %u/n", i,

    i); 則會印出 255 255 這不是 %d 和 %u 的問題, 而是 引數傳遞時資料轉換的問題 (見下面第 3 項) 不一樣的地方有下面幾個

    1. 資料的範圍基本上加上 unsigned 以後會變成 2 倍 2. 程式裡比較大小的時候 int i=1; int j=-1; if

    (i>j) printf("i>j/n"); else printf("ij

    unsigned int i=1; int j=-1; if (i>j) printf("i>j/n"); else

    printf("i

    compiler 會把 signed int 自動當成 unsigned int 來比較 2. 資料轉換的時候 (或是函式呼叫的時候) char

    i = -128; int j = i; 變數 i 裡面的資料只有 1 個位元組, 要放進 變數 j 裡面的時候需要做 sign

    extension 也就是多出來的 3 個位元組 (24 個 bit) 都要 填入原來 i 的 sign bit (第 8 個 bit)

    以上例來說 (用二進位制表示) i: 10000000 j: 11111111 11111111 11111111 10000000

    unsigned char i = -128; int j = i; 由 unsigned 轉為 signed 時前面一率補 0 用二進位制表示

    i: 10000000 j: 00000000 00000000 00000000 10000000 char i = -128;

    unsigned int j = i; 還是做 sign extension 用二進位制表示 i: 10000000 j: 11111111

    11111111 11111111 10000000 函式呼叫的時候會做型態的轉變, 例如 void fun(int x) { ... }

    呼叫時如果用 unsigned char i=-1; fun(i); 就會自動做轉換

  • 中秋節和大豐收的關聯?
  • 夢見鬼但是不嚇人怎麼回事?