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);
return 0; }
分析:
1.在vs2019中,a和b的类型相同,都是有符号字符型,所代表的范围是-128~127,所以打印时进行整型提升也不会改变,故a=-1,b=-1
2.c的类型是无符号字符型,所代表的范围是0~255,所以在使用时肯定会发生一些变化
🎈-1是整数在内存中占32bit位,由于整型在内存中以补码的形式保存,-1的补码是11111111 11111111 11111111 11111111,由于要存到c中去,而c只有8bit,所以会发生截断,只保留最后8位,即c中存的是11111111
🎈当c以%d(有符号整型)的进行打印时,会发生整型提升,由于c是无符号数,所以整型提升前面直接补0,即00000000 000000000 00000000 11111111,这就是补码,由于符号位是0,所以是个整数,打印后是255
2.下面程序输出值?
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
分析:
1.char是有符号字符型,范围是-128~127,没有超过最大范围
🎈-128是整型,在内存中的补码是11111111 11111111 11111111 10000000,由于char是8个bit位,发生截断,最后在a中存的是10000000
🎈当a以%u(无符号整型)进行打印时,发生整型提升,由于a是有符号数,所以根据符号位进行提升,即11111111 11111111 11111111 10000000,当以%u进行打印时,认为它是个正数,最后输出这个值是4294967168
3.下面程序输出值?
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
分析:
🎈a是有符号字符型,表示的范围是-128~127,超过了其最大范围
🎈128是整数,补码是00000000 00000000 00000000 10000000,由于a只有8个bit位,所以要发生截断,在a中存的就是10000000
🎈当a以%u进行打印时,先发生整型提升,由于a是有符号数,所以按照符号位进行提升,即11111111 11111111 11111111 10000000,由于以无符号数进行打印,所以认为提升后的这个数是个整数,其十进制是4294967168
4.下面程序输出值?
#include <stdio.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
return 0;
}
分析:
🎈该程序会死循环
🎈因为i是无符号数,程序会先执行9 8 7 6 5 4 3 2 1 0,然后i=-1,-1的补码是11111111 11111111 11111111 11111111,要存到i中,而i是无符号数,所以程序认为这是个整数,即4294967295,会死循环的执行下去
5.下面程序输出值?
#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’(数字0)的位置,在此之前出现多少个字符
🎈 char是有符号数,范围是-128~127
🎈-1~-128是正常存储的,当i是-129时,补码是11111111 11111111 11111111 01111111,截断后是01111111,即127
🎈当i是-255,即i+1是-256,补码是11111111 11111111 11111111 00000000,存到i中发生截断,即00000000,此时遇到0
🎈所以总的大小是-1~-128,127 ~1,共255个数
6.下面程序输出值?
#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,范围是8个bit位,当i是256时,00000000 00000000 00000001 00000000,存到i中会发生截断,即00000000,会从0开始重新计数,死循环