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...