整形截断int->char
整形提升char->int
%d-打印十进制有符号数字-以原码形式进行打印
%u-打印十进制无符号数字
整形截断-从右往左(低位到高位)
整形提升-按照符号位来提升
#include <stdio.h>
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d,b=%d,c=%d", a, b, c);//a=-1,b=-1,c=255
return 0;
}
10000000 00000000 00000000 00000001-原
11111111 11111111 11111111 11111110-反
11111111 11111111 11111111 11111111-补
11111111-整形截断(存储-char)-补
11111111 11111111 11111111 11111111-整形提升(打印-%d-int)-按照符号位进行提升-补
打印按照原码形式进行打印
char默认有符号,所以a和b相同
c
11111111
00000000 00000000 00000000 11111111整形提升-按照符号位进行提升-补
符号位为0-正数-正数原反补相同
00000000 00000000 00000000 11111111-原-255
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n", a);//4294967168
return 0;
}
-128
10000000 00000000 00000000 10000000-原
11111111 11111111 11111111 01111111-反
11111111 11111111 11111111 10000000-补
10000000-整形截断-补
char-有符号-符号位为1-整形提升:
11111111 11111111 11111111 10000000-补
%u-按照无符号数打印-无符号数原反补相同
11111111 11111111 11111111 10000000-原
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n", a);//4294967168
return 0;
}
128
00000000 00000000 00000000 10000000-原
01111111 11111111 11111111 01111111-反
01111111 11111111 11111111 10000000-补
10000000-整形截断-补
char-有符号-符号位为1-整形提升:
11111111 11111111 11111111 10000000-补
%u-按照无符号数打印-无符号数原反补相同
11111111 11111111 11111111 10000000-原
#include<stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);//-10
return 0;
}
i=-20
10000000 00000000 00000000 00010100 -原
11111111 11111111 11111111 11101011 -反
11111111 11111111 11111111 11101100 -补
j=10
00000000 00000000 00000000 00001010 -原反补
i+j
11111111 11111111 11111111 11101100 -补
00000000 00000000 00000000 00001010 -补
11111111 11111111 11111111 11110110 -补->原
11111111 11111111 11111111 11110101 -反
00000000 00000000 00000000 00001010 -原
#include<stdio.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);//死循环
}
return 0;
}
0-1=-1
-1变成一个超级大的数然后死循环
#include <stdio.h>
#include <string.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));//255
return 0;
}
char范围-128-127
-1...-128 127 ...0
#include <stdio.h>
unsigned char i = 0;
int main()
{
for (i = 0; i <= 255; i++)
{
printf("hello world\n");//死循环
}
return 0;
}
无符号数容易导致程序死循环
unsigned char范围0-255
i