你深度解剖数据在内存中的存储(4)

80 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

:punch: 小试牛刀

到这里我们已经学习了整型在内存中如何存储,我们来写几个练习巩固一下吧!

练习题目

下面一共7道题目 大家可以试着练习一下,我会给大家一一讲解

//练习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;
}
//练习2
#include <stdio.h>
int main()
{
    char a = -128;
    printf("%u\n",a);
    return 0;
}
//练习3
#include <stdio.h>
int main()
{
    char a = 128;
    printf("%u\n",a);
    return 0;
}
//练习4
#include <stdio.h>
int main()
{
  	int i= -20;
	unsigned  int  j = 10;
	printf("%d\n", i+j); 
	//按照补码的形式进行运算,最后格式化成为有符号整数
}
//练习5
#include <stdio.h>
int main()
{
	 unsigned int i;
	for(i = 9; i >= 0; i--)
	{
   		 printf("%u\n",i);
	}
 return 0;
}
//练习6
int main()
{
    char a[1000];
    int i;
    for(i=0; i<1000; i++)
    {
        a[i] = -1-i;
    }
    printf("%d",strlen(a));
    return 0;
}
//练习7
#include <stdio.h>
unsigned char i = 0;
int main()
{
    for(i = 0;i<=255;i++)
    {
        printf("hello world\n");
    }
    return 0;
}

:pushpin: 练习讲解

//练习1
//输出什么?
#include <stdio.h>
int main()
{
    char a = -1; 
    //-1 : 补码 11111111 11111111 11111111 11111111 
    //截断放入 a:  11111111 
    signed char b = -1;
    //-1截断放入b中 b: 11111111 
    unsigned char c = -1;
    // 同理 c: 11111111 
    printf("a=%d,b=%d,c=%d", a, b, c);
    //a和b是有符号字符型,%d打印整型提升补充符号位后
    //补码 11111111 11111111 11111111 11111111 
    //得到原码:10000000 00000000 00000000 00000001 
    //所以a和b打印结果是-1
    //而c是无符号字符型,所以整型提升,补充0
    //00000000 00000000 00000000 11111111 
    //转换原码 00000000 00000000 00000000 11111111 
    //所以c的打印结果是 225
    return 0;
}

运行结果 在这里插入图片描述

//练习2
#include <stdio.h>
int main()
{
    char a = -128;
    //-128 原码:00000000 00000000 00000000 10000000
    //补码: 11111111 11111111 11111111 10000000
    //截断存入char a 中  10000000
    printf("%u\n", a);
    //%u无符号的形式打印
    //a是有符号char 整型提升补充符号位
    // 11111111 11111111 11111111 10000000
    //而%u默认该数据为无符号数据,所以认为a的原码补码相同
    //打印结果 4294967168
    return 0;
}

运行结果 在这里插入图片描述

//练习3
#include <stdio.h>
int main()
{
    char a = 128;
    //128 00000000 00000000 00000000 10000000
    //截断存入char a :10000000
    printf("%u\n", a);
    //整型提升char a有符号,补符号位 
    //11111111 11111111 11111111 10000000
    //%u无符号的形式打印,认为该数据原码补码相同
    //打印 4294967168
    return 0;
}

在这里插入图片描述看到练习3的结果和练习2的结果一样,一个是-128,一个是128 但以%u打印了一样的结果! 在这里插入图片描述 因为无论是128还是-128截断后存储到a都是相同的二进制位!

//练习4
#include <stdio.h>
int main()
{
    int i = -20;
    //-20 原码:10000000 00000000 00000000 00010100
    //补码 : 11111111 11111111 11111111 11101100
    unsigned  int  j = 10;
    //10 :  00000000 00000000 00000000 00001010
    printf("%d\n", i + j);
    //i+j补码:11111111 11111111 11111111 11110110
    //原码:   10000000 00000000 00000000 00001010
    // 打印 -10
    //按照补码的形式进行运算,最后格式化成为有符号整数
}

运行结果 在这里插入图片描述

//练习5
#include <stdio.h>
int main()
{
    unsigned int i;  
    //无符号int i 所以始终大于等于0
    for (i = 9; i >= 0; i--)
    {
        printf("%u\n", i);
        //无法退出循环
    }
    return 0;
}

unsigned int 范围:0~2^32 在这里插入图片描述代码会发生死循环!

运行结果 在这里插入图片描述

//练习6
#include<stdio.h>
int main()
{
    char a[1000];
    int i;
    for (i = 0; i < 1000; i++)
    {
        a[i] = -1 - i;
        //a[i]是字符型,范围为-128~127
        //超过会进行截断存入a[i]中
        //当-129存入a[128]中截断
        //-129 :原 10000000 00000000 00000000 10000001
        //   补码  11111111 11111111 11111111 01111111
        //截断 后存入a[128]中 01111111
        //此时a[128]符号位为0  故存入的为 127
        //后面数据同理
        //当a[255]=-256 
        // -256 原 10000000 00000000 00000001 00000000
        //补码 :   11111111 11111111 11111111 00000000
        // 故此时a[255]存入的是 0
    }
    printf("%d", strlen(a));
    //strlen 遇到'\0'停止计数,也就arr[255],所以返回长度为255
    return 0;
}

在这里插入图片描述 char中的范围就是这样的,所以但一个数据小于-128时下一个数据就是127 大于127下一个数据就是-128 运行结果 在这里插入图片描述

//练习7
#include <stdio.h>
unsigned char i = 0;
//unsigned char  范围为0~255
int main()
{
    for (i = 0; i <= 255; i++)
    {
        printf("hello world\n");
        //当i=255时,i++后,i循环回到i=0
        //所以该代码会发生死循环
    }
    return 0;
}

在这里插入图片描述

运行结果 在这里插入图片描述 这就是所以练习的答案了,是不是还有点意犹未尽!如果还没学会可以多看几遍!