原码,反码,补码:
最高位当做符号位:0表示正数 1表示负数
无符号整数:
按权展开相加
有符号整数:
- 1.正数:
10: 0000 1010
原码 = 反码 = 补码 = 1010 - 2.负数:
1.将其绝对值按位取反,得到反码
2.对反码+1得到补码
例:
10 : 0000 1010
~10: 1111 0101
-10 : 1111 0110
-12 : 0000 1100 —— 1111 0011 —— 1111 0100
-13 : 0000 1101 —— 1111 0010 —— 1111 0011
127: 0111 1111 = 128-1 = 1000 0000 - 1
-128: 1000 0000 —— 0111 1111 —— 1000 0000
-1: 0000 0001 —— 1111 1110 —— 1111 1111
-1+1: 1111 1111+1 —— 10000 0000 —— 0000 0000
char a = -1;//-1
char b = 255;//-1,char默认有符号,取值范围-128~127
unsigned char c = -1;//255,无符号,取值范围0~255
unsigned char d = 255;//255
int e = a;//-1,有符号,取值范围-2^31~2^31-1
int f = b;//-1
int h = c;//255
int i = d;//255
unsigned int j = a;//42……,无符号,取值范围0~2^32-1
unsigned int k = b;//42……
unsigned int x = c;//255
unsigned int y = d;//255
printf("%d\n");
char -1:1111 1111
int -1:111……1111 1111(32个1) = -1
unsigned int -1:绝对值取反加1
(4 * 8 位 = 32 位)
1= 0 0 0 …… 0 0 1(31个0)
取反 = 1 1 1 …… 1 1 0(31个1)
加1= 1 1 1…… 1 1 1(32个1) = 232 - 1