關於unsigned與signed的轉換問題

2021-06-18 13:43:24 字數 2447 閱讀 3842

1.無論int是unsigned還是signed,如果int轉化為char,均擷取最低8位作為char的值。

2.例如

(1)如果char為signed

char c;

int i=193;

c=i;

printf("%d\n",c);//輸出-63,因為-63為193的補

過程:因為計算機儲存的是數的補碼所以:

193的二進位制為:1100,0001

則printf("%d\n",c);這句發生了char---->int 的變化所以發生了c語言中的無符號擴充套件和帶符號擴充套件

擴充套件的原則是:

1.有符號的資料型別,在向高精度擴充套件時,總是帶符號擴充套件

2.無符號的資料型別,在向高精度擴充套件時,總是無符號擴充套件

補碼:乙個數如果為正,則它的原碼、反碼、補碼相同;乙個數如果為負,則符號位為1,其餘各位是對原碼取反,然後整個數加1。

i=193 其補碼 1111,1111,1111,1111,1111,1111,1100,0001

所以再將其轉換為實際的數,先方法將符號位保留,

再已知乙個負數的補碼,將其轉換為十進位制數,步驟:

1、先對各位取反;

2、將其轉換為十進位制數;

3、加上負號,再減去1。

1111,1111,1111,1111,1111,1111,1100,0001---->1000,0000,0000,0000,0000,0000,0011,1110

----->-62-1=-63

(2)如果char為unsigned

unsigned char c;

int i=193;

c=i;

printf("%d\n",c);//輸出193

過程:因為計算機儲存的是數的補碼所以:

193的二進位制為:1100,0001

則printf("%d\n",c);這句發生了char---->int 的變化所以發生了c語言中的無符號擴充套件和帶符號擴充套件

原則同上:

0000,0000,0000,0000,0000,0000,1100,0001---->0000,0000,0000,0000,0000,0000,1100,0001----->=193

其它例子出處:

c語言中的無符號擴充套件和帶符號擴充套件

c語言中,當不同型別的資料進行運算的時候,就會發生強制或隱式型別轉換,通常是低精度的資料型別擴充套件到高精度的。有些時候,低精度的位數比較少,擴充套件到高精度的時候,就要在前面補充一些位。那麼這些位是補0還是補1呢?這就涉及到無符號擴充套件和帶符號擴充套件。

擴充套件的原則是:

1.有符號的資料型別,在向高精度擴充套件時,總是帶符號擴充套件

2.無符號的資料型別,在向高精度擴充套件時,總是無符號擴充套件

怎麼理解呢?首先來看一道題目,按此題目講解完你就明白了!

char ca=128;

unsigned char ucb=128;

unsigned short usc=0;

1)usc=ca + ucb;

printf("%x",usc);

2)usc=ca +(unsigned short)ucb;

printf("%x",usc);

3)usc=(unsignedchar)ca + ucb;

printf("%x",usc);

4)usc=ca+(char)ucb;

printf("%x",usc);

問,在1、2、3、4這4種情況下分別輸出什麼?

分析:1)對於char型別,有符號,128的二進位制是 1000 0000,已經溢位了,第一位會被當成符號位,也是就是說此時它是負數了,它擴充套件成unsigned short時,帶符號擴充套件,符號位為1,所以在前方補1,結果是1111 1111 1000 0000。ucb型別為nsigned char,無符號,二進位制是1000 0000,擴充套件成unsigned short時,無符號擴充套件,所以補0,結果是0000 0000 1000 0000,相加結果為 1 0000 0000 0000 0000 由於unsigned short是二位元組,捨棄最前面的1,所以得到0x0;

2)情況和1一樣,只是將ucb顯示強制轉換為unsigned short,所以得到0x0;

3)ca先強制轉換為unsignedchar,仍然是1000 0000,注意此時轉換後已經是乙個無符號數,所以再往unsigned short 擴充套件時,為無符號擴充套件,結果為0000 0000 1000 0000,ucb擴充套件後也是0000 0000 1000 0000,相加結果為 0000 0001 0000 0000,所以結果為0x100;

4)ca轉為unsigned short,帶符號擴充套件,為1111 1111 1000 0000,ucb先強制轉換為char,然後再轉為unsigned short,此時也要帶符號擴充套件,所以也是1111 1111 1000 0000,兩數相加,得到 1 1111 1111 0000 0000 ,所以結果為0xff00。

關於unsigned 的算術轉換

include int main else if i j else return 0 vs2010輸出結果如下 0 0 1 1 1 1 因為在執行算術運算時,運算元的型別如果不同,就會發生轉換。1.浮點型別朝著精度更高,長度更長的方向轉換,如float轉換為double 2.整型數如果轉換為sign...

C語言之unsigned 與signed

c語言之unsigned 與signed 無符號與有符號資料的操作區別在於當最高位,當最高位為0時都一樣 當最高位為1時,進行資料型別間的轉換操作就會產生問題,詳情如下 在c中,預設的基礎資料型別均為signed,現在我們以char為例,說明 signed char與unsigned char之間的...

MD5演算法與sign簽證

參考 ts a1的部落格,1 問題說明 sign簽證的可以解決,引數被修改。讓伺服器端和客戶端都有相同的生成sign的方法,只有前端和後端生成的sign相同,則說明,沒有被修改。如引數為 content 之後通過對該字串簽證,如對該串進行md5加密,如md5 64位加密,生成sign。放到 cont...