[轉] Unsigned VS signed

在定義整數變量的型態的時候可以加上 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 

[補:VS上的char是signed char實現]

 

Character values of type unsigned char have a range from 0 to 0xFF hexadecimal. A signed char has range 0x80 to 0x7F. These ranges translate to 0 to 255 decimal, and –128 to +127 decimal, respectively. The /J compiler option changes the default from signed to unsigned.

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你好";
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章