C語言有符號數與無符號數之間的轉換
無符號數:不存在正負之分,所有位都用來表示數的本身。
有符號數:最高位用來表示數的正負,最高位為1則表示負數,最高位為0則表示正數。
1.無符號數--->有符號數
看無符號數的最高位是否為1,如果不為1(為0),則有符號數就直接等於無符號數;如果無符號數的最高位為1,則將無符號數取補碼,得到的數就是有符號數。
以unsigned char 和char為例子:
1.1將無符號數2轉為有符號數
2的原碼是:0000 0010,可知最高位不為1,因此轉為有符號數之后也是2。
程序:
#include <stdio.h>
int main(void)
{
unsigned char i = 2;
printf("%d\n",(char)i);
return 0;
}
運行結果:2
1.2將無符號數130轉為有符號數
130的原碼是:1000 0010,可知最高位為1,因此需要取它的補碼,補碼為1111 1110,這是一個負數,取最高位作為-號,取最低7位作為數值得到的結果是-126。
程序:
1 #include <stdio.h>
int main(void)
{
unsigned char i = 130;
printf("%d\n",(char)i);
return 0;
}
運行結果:-126
2.有符號數--->無符號數
看有符號數的最高位是否為1,如果不為1(為0),則無符號數就直接等於有符號數;如果有符號數的最高位為1,則將有符號數取補碼,得到的數就是無符號數。
以char 和unsigned char為例子:
2.1將有符號數3轉為無符號數
3的原碼是:0000 0011,可知最高位不為1,因此轉為無符號數之后也是3。
程序:
#include <stdio.h>
int main(void)
{
char i = 3;
printf("%u\n",(unsigned char)i);
return 0;
}
運行結果:3
2.2將有符號數-7轉為無符號數
-7的原碼是:1000 0111,可知最高位為1,因此需要取它的補碼,補碼為1111 1001,這是一個正數,因此整個數的值就是249。
程序:
#include <stdio.h>
int main(void)
{
char i = -7;
printf("%u\n",(unsigned char)i);
return 0;
}
運行結果:249
總結:
有符號數與無符號數之間的轉換,都要看要轉換的數的最高位是否為1,如果不為1,則轉換結果就是要轉換的數的本身;如果為1,則轉換結果就是轉換的數(看作是負數)的補碼。
轉自:https://www.cnblogs.com/lknlfy/archive/2013/04/02/2996320.html