0
点赞
收藏
分享

微信扫一扫

Android 13 变更及适配攻略

互联网码农 2023-05-30 阅读 76

在这里插入图片描述


数据的存储


1. 前言🚩


2. 整型在内存中的存储🚩

比如我们定义两个整型变量:

int a = 20;
int b = -10;

我们知道整型在内存中占四个字节的空间,在这之前我们先了解下面的概念


2.1 源码,反码,补码🏁

  • 源码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。
  • 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
  • 补码:反码+1就得到补码。

我们说正整数的源码,反码,补码都相同.并且对于整形来说:数据存放内存中其实存放的是补码。

	int main()
{
	int num  = 20;//创建一个整型变量,叫 num,这时num向内存申请4个字节来存放数据
	//4个字节-32比特位
	//00000000000000000000000000010100-原码
	//00000000000000000000000000010100-反码
	//00000000000000000000000000010100-补码
    //正整数源反补相同
	int num2 = -10;//
	//10000000000000000000000000001010 - 原码
	//11111111111111111111111111110101 - 反码
	//11111111111111111111111111110110 - 补码
	//
	return 0;
}

假设我们要将这两个数相加,我们试试用反码,和补码相加,哪个是正确的:

源码相加:

//0000000000000000000000010100  num
//1000000000000000000000001010  num2
//1000000000000000000000011110  30的源码

补码相加:

//000000000000000000000010100  num
//111111111111111111111110110  num2
//011111111111111111111110110  补码
//000000000000000000000001010  10的源码   

我们有看见用补码做加减法是刚好符合逻辑的.

我们再来看看 -10 在 vs2022 编译器上的内存存储:

在这里插入图片描述


3. 大端和小端🚩

我们之前观察了补码在内存中的存储,我们发现有一点奇怪,为什么数据是倒着放的?这里我们用变量a来阐述这个问题

int a = 0x11223344;
  • 大端字节序(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
  • 小端字节序(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中

字节序—就是以字节为单位,讨论存储顺序的.这里的 11 为一个字节, 22 为一个字节,整型共四个字节


在这里插入图片描述


3.1 为什么有大端小端?🏁


3.2 怎样判断大小端🏁

怎么写一个代码判断当前机器是大端还是小端? 这里我们定义一个整型变量a的值为1

它在大小端机器上应该是这样存储的:

在这里插入图片描述


#include<stdio.h>
	int main()
{
		int a = 1;
		char* p = (char*)&a;//强制类型转换,否则会报警告
		if (*p == 1)
		{
			printf("当前机器为小端");
		}
		else
		{
			printf("当前机器为大端");
		}
	return 0;
}

4. 类型的范围🚩

我们把整型家族划分为:
在这里插入图片描述
下面我们主要来讨论 char 类型的范围,并做一些练习


4.1 char 类型的范围🏁

在这里插入图片描述
再来看看无符号位的存储:

在这里插入图片描述

  • 有符号位char的范围: -128~127
  • 无符号位char的范围: 0~255

在这里插入图片描述

在这里插入图片描述


5. 练习🚩

5.1 练习一🏁

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;
}

5.2 练习二🏁

2.
#include <stdio.h>
int main()
{
    char a = -128;
    printf("%u\n",a);
    return 0;
}

5.3 练习三🏁

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

这里给大家看一看现象:

死循环


5.4 练习四🏁

4.
int main()
{
    char a[1000];
    int i;
    for(i=0; i<1000; i++)
   {
        a[i] = -1-i;
   }
    printf("%d",strlen(a));
    return 0;
}

5.5 练习五🏁

5.
#include <stdio.h>
unsigned char i = 0;
int main()
{
    for(i = 0;i<=255;i++)
   {
        printf("hello world\n");
   }
    return 0;
}

6. 总结🚩

🔎 下期预告: C语言进阶 🔍
\
举报

相关推荐

0 条评论