例题1:
输出什么?
#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);//-1 -1 255
return 0;
}
解析版:
#include <stdio.h>
int main()
{
char a= -1;
//11111111111111111111111111111111
//11111111
//整形提升:按符号位提升,由于char是有符号数,所以符号位是1,所以在前面补1
//11111111111111111111111111111111
signed char b=-1;
//11111111
//整形提升:按符号位提升,由于char是有符号数,所以符号位是1,所以在前面补1
//11111111111111111111111111111111
unsigned char c=-1;
//11111111
//整形提升:按符号位提升,由于unsigned char是无符号数,所以没有符号位,所以在前面补0
//00000000000000000000000011111111
//正数:255
printf("a=%d,b=%d,c=%d",a,b,c);//-1 -1 255
return 0;
}
例题2:
输出什么?
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
解析版:
#include <stdio.h>
int main()
{
char a = -128;
//10000000000000000000000010000000
//01111111111111111111111101111111
//01111111111111111111111110000000-补码
//10000000
//11111111111111111111111110000000整形提升
printf("%u\n",a);
//打印的是无符号数,直接看其为原码
//4294967168
//%d 有符号10进制整数
//%u 无符号10进制整数
return 0;
}
例题3:
解析版:
#include <stdio.h>
int main()
{
char a = 128;//127+1相当于-128,和例题2一样
printf("%u\n",a);
return 0;
}
例题4:
输出什么?
int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);
解析版:
int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);//-10
//按照补码的形式进行运算,最后格式化成为有符号整数
11111111 11111111 11111111 11101100//-20的补码
00000000 00000000 00000000 00001010//10的补码
11111111 11111111 11111111 11110110//结果的补码
10000000 00000000 000000000 00001010//原码-10
例题5:
输出什么?
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
解析版:
9876543210然后死循环-1对应的超大的数
例题6:
输出什么?
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
解析版:
int main()
{
char a[1000];//0-999,但char只能放-128到127
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}//-1 -2 …… -127 -128 127 126 125……3 2 1 0(strlen读到这停止) -1 -2……
printf("%d",strlen(a));//strlen读到'\0'停止:255
return 0;
}
例题7:
输出什么?
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}
解析版:
结果:死循环
原因:无符号数255+1=0