在定義整數變量的型態的時候可以加上 unsigned 或是 signed, 例如<?XML:NAMESPACE PREFIX = O />
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("i<=j/n");
你會發現結果是 i>j
unsigned int i=1;
int j=-1;
if (i>j) printf("i>j/n");
else printf("i<=j/n");
你會發現結果是 i<=j
也就是說 signed 和 unsigned 在比較的時候 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);
就會自動做轉換
////////////////////unsigned char VS signed char////////////////
C51初期 /xmm1981 發表於2007-09-24, 18:35
[補:VS上的char是signed char實現]
char 是有符號的
unsigned char 是無符號的,裏面全是正數
兩者都作爲字符用的話是沒有區別的,但當整數用時有區別:
char 整數範圍爲-128到127( 0x80__0x7F),
而unsigned char 整數範圍爲0到255( 0__0xFF )
多數情況下,char ,signed char 、unsigned char 類型的數據具有相同的特性然而當你把一個單字節的數賦給一個大整型數域時,便會看到它們在符號擴展上的差異。另一個區別表現在當把一個介於128和255之間的數賦給signed char 變量時編譯器必須先進行數值轉化,同樣還會出現警告。若使用十六進制進行賦值使用unsigned char 要方便一些.根據編譯器具體實現情況不同,char要麼和signed char等同,要麼和unsigned char等同.
功能:統計字符串裏面的漢字的個數 (gb2312編碼內碼大於0xa0)
char szText[]= "12345你好";
l= strlen(szText);
int sum=0;
for (int i=0; i< l; i++)
if (szText[i] > 0xa0)
sum++;
sum/=2;
這樣你根本統計出到任何漢字,
因爲char是有符號的,打最大就是127,超過就變成複數了。比如7f 是127,那麼80就是-1了。
這時候你一定要寫成
unsigned char szText[]= "12345你好";