配套练习1

配套练习1及解析

      • 题一
          • 原因:
      • 题二
          • 原因:
      • 题三
          • 原因:
      • 题四
          • 原因:
      • 题五
          • 原因:
      • 题六
          • 原因:

题一

#include

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 

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按照无符号的形式打印,可看下面的图片
配套练习1_第1张图片


题三

#include 

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按照无符号的形式打印,可看下面的图片

配套练习1_第2张图片


题四

#include

int main()
{
	unsigned int i;

	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}

	return 0;
}

运行的结果:
死循环

原因:

在无符号整型里面,数的范围在0~4294967295,都大于或等于0,始终满足循环条件i >= 0,所以死循环


题五

#include

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 

unsigned char i = 0;

int main()
{
    for(i = 0;i<=255;i++)
   {
        printf("hello world\n");
   }
    return 0;
}

运行的结果:
死循环

原因:

unsigned char类型可以储存的范围是0~255,始终满足循环条件i<=255,最终死循环

你可能感兴趣的:(C语言,c语言,算法,学习,c++)