题一
#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);
return 0;
}
运行的结果:
原因:
在VS2019编译器里,char默认为有符号的char类型,储存-1,就会打印-1
unsigned char类型可以储存的范围是0~255,因为整型数据在储存的时候是以补码的形式储存的,-1的补码是1111 1111
,储存在无符号char类型时,最高位1不再是符号位,变成了有效位,对应的数时255
题二
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
运行的结果:
原因:
-128
补码:0xff ff ff 80
储存在char里面,截断低位一个字节里储存的数据0x80
(补码)
在char里是-128
开始打印时会进行整型提升
0x80
——>0xff ff ff 80
然后打印时%u把0xff ff ff 80
按照无符号的形式打印,可看下面的图片
题三
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
运行的结果:
原因:
我们知道,char类型的变量里面数的范围在-128~127里
128的补码是0x00 00 00 80
储存在char里面,截断低位一个字节里储存的数据0x80
(补码)
在char里是-128
开始打印时会进行整型提升
0x80
——>0xff ff ff 80
然后打印时%u把0xff ff ff 80
按照无符号的形式打印,可看下面的图片
题四
#include<stdio.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
return 0;
}
运行的结果:
死循环
原因:
在无符号整型里面,数的范围在0~4294967295,都大于或等于0,始终满足循环条件
i >= 0
,所以死循环
题五
#include<stdio.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
运行的结果:
原因:
strlen是一个计算字符串长度的函数,在识别到
\0(对应的ASCII码值为0)
时,停止继续向后识别,返回当前识别到的字符串长度,不包含\0
计算过程大概是这样的:
-1,-2…-128,127,126…1,0,-1…在a[256]里放入了0,在strlen识别到这里时就停了下来,返回了255
题六
#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<=255
,最终死循环